我有一个包含列id,用户名,时间戳的表。
ID Username timestamp 1 aaa 10/10/2009 1 bbb 12/10/2010 2 ccc 10/11/2009 2 ddd 12/10/2010 2 eee 12/05/2011 3 kkk 04/03/2012
输出应该为我们提供最近插入的ID,用户名。
1 bbb 12/10/2010 2 eee 12/05/2011 3 kkk 04/03/2012
我想过使用Join这样做。但是我能写一个更有效的查询吗?
答案 0 :(得分: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;
如果存在平局的可能性(两行具有相同的id
和timestamp
),则这将返回两行。您可以展开order by
以指定您想要的哪些绑定行,或者您可以切换到使用row_number
分析函数而不是rank
来任意获取其中一个绑定行。
答案 1 :(得分:0)
使用聚合函数的另一个选项。这会从Justin的查询中删除子查询,但确实意味着需要在每个返回的列上添加LAST
函数。
select
id,
max(username) keep (dense_rank last order by timestamp),
max(timestamp)
from my_table
group by id
不幸的是,在命令开头需要聚合函数(MAX,MIN,SUM,AVG等)时,LAST和FIRST函数的语法略显奇怪。如果分区和排序提供了确定性集合,则这会令人困惑,但这意味着结果将保持一致。