所以我有一個串列如下:
表格1
ID TIMESTAMP GROUP
001 2021-04-01 12:51:12.063 A
001 2021-04-04 12:51:12.063 G
001 2021-04-14 10:47:03.022 B
002 2021-01-13 09:46:23.012 C
003 2021-09-10 03:32:53.043 D
004 2021-04-13 01:12:54.056 D
004 2021-04-13 11:12:26.054 A
004 2021-04-13 21:53:36.023 D
005 2021-04-01 13:53:13.023 F
005 2021-04-11 13:53:13.023 J
003 2022-04-13 20:32:11.011 G
006 2021-08-13 20:32:11.011 G
我還有一個事件串列:
表2
EVENT ID TIMESTAMP
eventA 001 2021-04-02 12:51:12.063
eventB 001 2021-04-13 12:51:12.063
eventA 002 2021-04-01 12:51:12.063
eventA 002 2021-04-13 12:51:12.063
eventA 002 2021-04-14 12:51:12.063
eventA 003 2021-10-17 12:51:12.063
eventB 005 2021-04-10 12:51:12.063
eventB 005 2021-04-21 12:51:12.063
eventA 006 2021-05-01 20:32:11.011
我的目標是針對表 2 中的每個事件,我想根據 ID 加入表 1 中的最新條目。如果表 1 中沒有前面的條目,盡管它們存在,它們在連接上應該為空。
簡而言之,對于表 2 中的每一行,我們需要根據時間戳找到該 ID 的最新組。
最后結果
EVENT ID TIMESTAMP group
eventA 001 2021-04-02 12:51:12.063 A
eventB 001 2021-04-13 12:51:12.063 G
eventA 002 2021-04-01 12:51:12.063 NULL
eventA 002 2021-04-13 12:51:12.063 C
eventA 002 2021-04-14 12:51:12.063 C
eventA 003 2021-10-17 12:51:12.063 D
eventB 005 2021-04-10 12:51:12.063 F
eventB 005 2021-04-21 12:51:12.063 J
eventA 006 2021-05-01 20:32:11.011 NULL
uj5u.com熱心網友回復:
因此,如果您根據先前(相等?)時間戳執行 LEFT JOIN,然后使用 QUALIFY 將過度匹配修剪為最近的,則可以通過以下方式完成:
SELECT t2.event
t2.id
t2.timestamp
t1.group
FROM table2 AS t2
LEFT JOIN table1 AS t1
ON t2.id = t1.id AND t2.timestamp >= t1.timestamp
QUALIFY ROW_NUMBER() OVER (
PARTITON BY t2.id, t2.timestamp
ORDER BY t1.timestamp DESC NULLS LAST
) = 1
ORDER BY 1,2,3;
只要 Table2 沒有重復的 ID、時間戳值,這就會起作用
uj5u.com熱心網友回復:
帶有 QUALIFY ROW_NUMBER() 的視窗函式用于獲取 Simeon 所示的最新行。我發現對于這種型別的連接(通常稱為 AsOf 連接),如果這個連接的表非常大,找到最大時間戳和重新連接方法通常比使用視窗函式完成得更快:
select J."EVENT", J.ID, J."TIMESTAMP", "GROUP" from
(select * from T2,
lateral (select max(T1."TIMESTAMP") TS from T1 where T1.ID = T2.ID and T1.TIMESTAMP < T2."TIMESTAMP")) J
left join T1 on J.TS = T1."TIMESTAMP"
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/366698.html
