use*_*273 11 sql oracle greatest-n-per-group
我在留言簿中有一个包含用户评论的表格.列是:id,user_id,title,comment,timestamp.
我需要为每个用户选择最新的行.我已尝试使用group by但没有管理它,因为我无法在同一查询中选择其他任何我按user_id分组的内容:
SELECT user_id, MAX(ts) FROM comments GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)
例如,在此查询中,我无法添加也选择列id,tilte和comment.如何才能做到这一点?
您可以使用以下内容构建查询JOIN
:
select c.*
from comments c join
(select user_id, max(ts) as maxts
from comments c2
group by user_id
) cc
on c.user_id = cc.user_id and c.ts = cc.maxts;
Run Code Online (Sandbox Code Playgroud)
还有其他方法.典型的建议是使用row_number()
:
select t.*
from (select c.*, row_number() over (partition by user_id order by ts desc) as seqnum
from comments c
) c
where seqnum = 1;
Run Code Online (Sandbox Code Playgroud)
这两个查询略有不同.如果用户的最新评论完全相同,则第一个将返回重复项ts
.第二个返回每个用户一行.
您可以使用分析函数
SELECT *
FROM (SELECT c.*,
rank() over (partition by user_id order by ts desc) rnk
FROM comments c)
WHERE rnk = 1
Run Code Online (Sandbox Code Playgroud)
根据您想要处理关系的方式(如果可以有两行具有相同user_id
和ts
),您可能希望使用row_number
或dense_rank
函数而不是rank
. rank
如果存在平局,则允许多行为第一行. row_number
如果有平局,会随意返回一行. 对于首先绑定的行dense_rank
会表现得像rank
行,但是会认为下一行是第二行而不是第三行,假设两行首先绑定.
归档时间: |
|
查看次数: |
11544 次 |
最近记录: |