从oracle中为每个组选择最新行

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.如何才能做到这一点?

Gor*_*off 8

您可以使用以下内容构建查询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.第二个返回每个用户一行.


Jus*_*ave 7

您可以使用分析函数

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_idts),您可能希望使用row_numberdense_rank函数而不是rank. rank如果存在平局,则允许多行为第一行. row_number如果有平局,会随意返回一行. 对于首先绑定的行dense_rank会表现得像rank行,但是会认为下一行是第二行而不是第三行,假设两行首先绑定.