sql - 有效地为一个非常大的表中的每个组选择最新行?
问题描述
我有(例如为了)一张桌子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;
我知道我自己加入了一个错误表,但希望第一次加入小表会减少处理的行数。
无论如何,似乎窗口函数是这里的解决方案。
解决方案
也许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()
推测它可能会使用更少的资源。
推荐阅读
- php - 选择所有有待处理订单的 woocommerce 客户
- c# - 如何从一年内的月份列表中找到缺失的月份
- perl - 如何使用睡眠暂停循环的每次迭代?
- c# - xElement.Descendants 返回组合值“falsefalse”
- html - Css select:应用样式时不显示选择的下拉选项
- javascript - 如何在 Web Javascript SDK 中的 Agora Video Live Streaming 中再发布两个主机?
- c - 如何在 C 语言中为 Linux 发出哔哔声
- sql-server - 这个 where 子句总是返回 false 吗?
- c# - C# Winforms - 将生存状态从一个用户控件切换到另一个用户控件?
- asynchronous - 如何正确显示行内的未来?