0

我有一个包含 id、username、timestamp 列的表。

ID 用户名时间戳
1 个 2009 年 10 月 10 日
1 bbb 2010 年 12 月 10 日
2 cc 2009 年 10 月 11 日
2 日 12/10/2010
2 EEE 2011 年 12 月 5 日
3 kkk 04/03/2012

输出应该为我们提供最近插入的 ID、用户名。

1 bbb 2010 年 12 月 10 日
2 EEE 2011 年 12 月 5 日
3 kkk 04/03/2012

我想使用 Join 来做到这一点。但是我可以写一个更有效的查询吗?

4

2 回答 2

2

您可以使用分析函数

SELECT id,
       username,
       timestamp
  FROM (SELECT id,
               username,
               timestamp,
               rank() over (partition by id
                                order by timestamp desc) rnk
          FROM your_table_name )
 WHERE rnk = 1;

如果有可能出现平局(两行具有相同的idtimestamp),这将返回两行。您可以扩展order by以指定您想要的绑定行,或者您可以切换到使用row_number分析函数而不是rank任意获取其中一个绑定行。

于 2012-05-02T17:28:16.593 回答
0

使用聚合函数的另一个选项。这从 Justin 的查询中删除了子查询,但确实意味着LAST需要在返回的每一列上添加该函数。

select 
  id, 
  max(username) keep (dense_rank last order by timestamp), 
  max(timestamp)
from my_table
group by id

不幸的是,LAST 和 FIRST 函数的语法有点奇怪,因为在命令开头需要一个聚合函数(MAX、MIN、SUM、AVG 等)。如果分区和排序提供了一个确定性的集合来处理,这会令人困惑,但意味着结果将是一致的。

于 2012-05-02T22:39:35.417 回答