Oracle

比較重複項並在連接中選擇具有最近日期的重複項

  • January 31, 2019

假設我有表 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:您的範例似乎模棱兩可,“名稱”也是關鍵嗎?

引用自:https://dba.stackexchange.com/questions/228548