sql - 从 oracle 为每个组选择最新的行

标签 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

例如,在此查询中,我无法添加到还选择列 id、tilte 和 comment。如何才能做到这一点?

最佳答案

您可以使用分析函数

SELECT *
  FROM (SELECT c.*,
               rank() over (partition by user_id order by ts desc) rnk
          FROM comments c)
 WHERE rnk = 1

根据您希望如何处理关系(如果可以有两行具有相同的 user_idts ),您可能需要使用 row_numberdense_rank函数而不是 rank . rank如果有平局,将允许多行排在第一位。 row_number如果有平局,将任意返回一行。 dense_rank会表现得像 rank对于第一行并列但会认为下一行是第二行而不是第三行,假设两行并列第一。

关于sql - 从 oracle 为每个组选择最新的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40404497/

相关文章:

sql - 如何在 Linq 中编写 SELECT FROM myTable WHERE id IN (SELECT...)?

SQLite 插入或选择主键

oracle - DD/MM/YYYY HH 的日期转换 :MM:SS to YYYYMM

sql - 在 SQLite 中连接三个表的最佳方式

SQL:查找每组的最大记录

sql - "Invalid Column Name"即使列已创建?

sql - 强制转换规范的字符值无效 (#0) - 我知道问题所在,但不知道如何解决

sql - 长期 Oracle 开发人员/DBA 学习 SQL Server - 书籍推荐吗?

oracle - Ubuntu:oci:找不到命令

mysql - 从内部连接中检索不同的记录