Oracle
比較重複項並在連接中選擇具有最近日期的重複項
假設我有表 A:
id: name: timestamp: 1 Bob 2018-05-31 04:46:37 2 Alice 2019-01-31 07:13:56 1 Bob 2019-01-15 18:23:74
我想加入另一個表 B:
id: name: Preference: 1 Bob Car 2 Alice Bike
ID 本身不是主鍵。但是 ID + 時間戳是唯一鍵。但是,我將如何只加入具有最新日期的副本的 1 部分?這樣我就會得到一個像這樣的連接表:
id: name: Preference: Timestamp: 1 Bob Car 2019-01-15 18:23:34 2 Alice Bike 2019-01-31 07:13:56
如果我有重複,然後比較重複之間的日期並選擇最新的
您可以在子查詢中使用
LATERAL
連接或CROSS APPLY
(都在版本 12c 中添加)或視窗排名函式,這些函式也應該在舊版本中工作:WITH cte AS ( SELECT b.id, b.name, b.preference, a.timestamp, -- keep only columns you need ROW_NUMBER() OVER (PARTITION BY b.id ORDER BY a.timestamp DESC) AS rn FROM b LEFT JOIN a ON b.id = a.id ) SELECT cte.* -- keep only columns you need FROM cte WHERE rn = 1 -- ORDER BY b.id ;
您可以將聚合與“KEEP LAST”一起使用。它將從由另一列排序的組中選擇列的最後一個值。
select a.id , a.name , max(b.preference) KEEP (DENSE_RANK LAST ORDER BY A.TIMESTAMP) , max(a.timestamp) from A join B on (a.id = b.id and a.name=b.name) group by a.id, a.name
PS:您的範例似乎模棱兩可,“名稱”也是關鍵嗎?