[英]Selecting compared pairs from table
我真的不知道該怎么形容。 我有一張桌子:
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數據庫11g
您可以使用ROW_NUMBER()
分析函數來完成此操作:
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(...)
)。
有一個子選擇返回每個id及其最大日期:
select * from table
where (id, date) in (select id, max(date) from table group by id)
您可以使用NOT EXISTS()
:
SELECT * FROM YourTable t
WHERE NOT EXISTS(SELECT 1 FROM YourTable s
WHERE t.id = s.id and s.date > t.date)
可能最有效的方法是:
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中運行良好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.