首页 > 解决方案 > 有效地为一个非常大的表中的每个组选择最新行?

问题描述

我有(例如为了)一张桌子Users (user_id, status, timestamp, ...)
我还有另一张桌子SpecialUsers (user_id, ...)

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

问题是该Users非常非常大(超过 500亿行)。例如这个问题中的大多数解决方案只是挂起或出现“磁盘已满”错误。

SpecialUsers表要小得多 - “只有” 600K 行。

SELECT DISTINCT ON()不支持。在 Amazon RedShift 上工作。

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

with users_with_status (user_id, status, timestamp)
as (
        select su.user_id, u.instance_type, u.timestamp
        from specialusers su
        join users u on su.user_id = u.user_id
)
select l.instance_id, l.instance_type
from users_with_status l
left outer join users_with_status r
     on l.user_id = r.user_id and l.timestamp < r.timestamp
where r.timestamp is null;

我知道我自己加入了一个错误表,但希望第一次加入小表会减少处理的行数。

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

标签: sqlamazon-redshiftquery-optimizationgreatest-n-per-group

解决方案


也许join带有窗口功能的 a 会起作用:

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()推测它可能会使用更少的资源。


推荐阅读