我有兩個這樣的表:
命令
| 日期 | 交易ID | COL3 |
|---|---|---|
| 2021-06 | 1234 | 4 |
| 2021-09 | 1238 | 8 |
聚合酶
| 日期 | 用戶 | 交易ID |
|---|---|---|
| 2021-06 | 3333 | 1234 |
| 2021-03 | 3333 | XXXX |
| 2021-02 | 3333 | XXXX |
| 2021-09 | 4444 | 1238 |
| 2021-05 | 4444 | XXXX |
| 2021-01 | 4444 | XXXX |
在 AGG 中,一個用戶可以有很多事務,ORDERS 表只是它的一個子集。
對于 Orders 中的每個 TransactID,我需要進入 Agg 表并獲取與 TransactID 關聯的用戶的最小日期。
然后,我需要計算 ORDERS.Date 和最小 AGG.DATE 之間的日期差。結果存盤在 SDP.COL3 中。COL3 基本上可以描述為Days since First Transaction。
我從來沒有做過這樣多步驟的 SQL 問題,需要一些指導。任何幫助將不勝感激!
uj5u.com熱心網友回復:
如果我做對了
SELECT SDP.TXN_ID, sdp.dt, datediff(sdp.dt, min(a1.DT)) diff
FROM SDP
JOIN AGG a1 on a1.UserID =
(SELECT a2.UserID
FROM AGG a2
WHERE SDP.TXN_ID = a2.TXN_ID
ORDER BY a2.UserID
limit 1)
GROUP BY SDP.TXN_ID, sdp.dt
你可以省略
ORDER BY a2.UserID
limit 1
前提是每筆交易始終屬于單個用戶。
小提琴
uj5u.com熱心網友回復:
基于你的 SQL Fiddler ( http://sqlfiddle.com/#!9/101497/1 ) 這應該讓你開始
SELECT TXN_ID, DT, USERID
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY sdp.TXN_ID ORDER BY sdp.DT ASC) AS [index],
sdp.TXN_ID,
sdp.DT,
agg.USERID
FROM sdp
LEFT JOIN agg ON sdp.TXN_ID = agg.TXN_ID) A
WHERE [index] = 1
有關更多資訊,您應該查看
https://www.sqlshack.com/sql-partition-by-clause-overview/
https://www.sqltutorial.org/sql-window-functions/sql-partition-by/
https://learnsql.com/blog/partition-by-with-over-sql/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/447321.html
上一篇:Pyspark:在帶有列的串列中使用文本進行正則運算式搜索
下一篇:棘手的pyspark值排序
