在一个非常大的表中为每个组有效地选择最新行?

我有(例如)一张桌子 <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <button class="matrix-size">$$ { \left( 2 \times 4 \right) } $$</button> <button class="matrix-size">$$ { \left( 5 \times 5 \right) } $$</button> <button class="matrix-size"><img src="https://es.symbolab.com/public/img/pad_matrixnxn.png "></button>
我还有一张桌子 private fun loadKey(alias: String) : SecretKey? { var key: SecretKey? = null try { val ks: KeyStore = KeyStore.getInstance(androidKeyStore) ks.load(null) key = (ks.getEntry(alias,null) as KeyStore.SecretKeyEntry).secretKey } catch (e:Exception) { App.d(TAG,"loadKey Ex: ${e.message}") } return key }

我需要显示每个特殊用户的最新状态。

问题在于 Users (user_id,status,timestamp,...)非常、非常大(超过 50 十亿 行)。例如 this question 中的大多数解决方案只是挂起或出现“磁盘已满”错误。

SpecialUsers (user_id,...) 表要小得多——“只有”60 万行。

Users 不受支持。使用 Amazon RedShift。

EDIT:根据请求查看失败的尝试 - 导致磁盘已满错误的其中一个是这样的:

SpecialUsers

我知道我正在将一个错误表与自身连接,但希望与小表的第一次连接会减少处理的行数。

无论如何,似乎窗口函数是这里的解决方案。

iCMS 回答:在一个非常大的表中为每个组有效地选择最新行?

也许带有窗口函数的 join 会起作用:

select su.*
from (select s.user_id,u.status,u.timestamp,max(u.timestamp) over (partition by s.user_id) as max_timestamp
      from specialusers s join
           users u
           on s.user_id = u.user_id
     ) su
where timestamp = max_timestamp;

这特别使用 max() 而不是 row_number() 推测它可能使用更少的资源。

本文链接:https://www.f2er.com/109997.html

大家都在问