我真的不知道如何描述它。我有一张桌子:
ID | Name | Date
-------------------------
1 | Mike | 01.01.2016
1 | Michael | 02.03.2016
2 | Samuel | 23.12.2015
2 | Sam | 05.03.2015
3 | Tony | 02.04.2012
我想在每对中选择具有最新日期的ID和名称对。结果应该是:
ID | Name | Date
-------------------------
1 | Michael | 02.03.2016
2 | Samuel | 23.12.2015
3 | Tony | 02.04.2012
我如何实现这一目标?
Oracle Database 11g
答案 0 :(得分:2)
您可以使用ROW_NUMBER()
analytic function:
SELECT id, name, "date"
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY id ORDER BY "date" DESC ) rn
FROM table_name t
)
WHERE rn = 1
这只需要一次表格扫描(它没有自我加入或相关的子查询 - 即IN (...)
或EXISTS(...)
)。
答案 1 :(得分:1)
有一个子选择,返回每个id及其最大日期:
select * from table
where (id, date) in (select id, max(date) from table group by id)
答案 2 :(得分:1)
您可以使用NOT EXISTS()
:
SELECT * FROM YourTable t
WHERE NOT EXISTS(SELECT 1 FROM YourTable s
WHERE t.id = s.id and s.date > t.date)
答案 3 :(得分:0)
可能最有效的方法是:
select t.*
from table t
where t.date = (select max(date) from table t2 where t2.id = t.id);
以及table(id, date)
上的索引。
此版本应扫描表并在索引中查找正确的值。
或者,如果只有三列,则可以使用keep
:
select id, max(date) as date,
max(name) keep (dense_rank first order by date desc) as name
from table
group by id;
我发现这个版本在Oracle中运行得非常好。