SQL给出最近插入的记录

时间:2012-05-02 17:19:01

标签: sql oracle oracle10g

我有一个包含列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这样做。但是我能写一个更有效的查询吗?

2 个答案:

答案 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;

如果存在平局的可能性(两行具有相同的idtimestamp),则这将返回两行。您可以展开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函数的语法略显奇怪。如果分区和排序提供了确定性集合,则这会令人困惑,但这意味着结果将保持一致。