dav*_*vka 5 sql query-optimization greatest-n-per-group amazon-redshift
我有(例如)一张桌子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;
Run Code Online (Sandbox Code Playgroud)
我知道我正在将错误表与其自身连接,但希望与小表的第一个连接会减少已处理的行数。
不管怎样,窗口函数似乎是这里的解决方案。
也许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;
Run Code Online (Sandbox Code Playgroud)
这是专门使用的max(),而不是基于row_number()它可能使用稍微更少的资源的猜测。
| 归档时间: |
|
| 查看次数: |
1802 次 |
| 最近记录: |