Db2
DB2 視窗函式 - 在前 N 分鐘的行中執行總計 X
對視窗功能非常陌生,但我想我明白了。
我試圖以 10 分鐘的間隔獲得一列的滾動總和(由單獨的時間戳列確定)
工作範例可能如下所示:
編輯: 小提琴連結
過濾 T2 更好地突出它:
像這樣或這樣的主題有很多,但我無法找到特定於我要求的解決方案。
如果我每隔 10 分鐘不需要它,那將非常簡單,只需 10 行(目前 + 9 之前);
SELECT ID, TIME, P/L, SUM(P/L) OVER (PARTITION BY ID ORDER BY TIME ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) as ROLLING FROM TABLE
也許使用視窗函式無法添加 10 分鐘約束?
############## 編輯兩個##############
好的,所以我已經解決了這個問題並設法在小提琴中重現它
在真實表中有有效的重複事務(相同的 ID 和 TIME),我想我可以拉回微秒並解決這個問題,但不幸的是這些沒有儲存。
我們最終得到了一個奇怪的反向總和,這可能不是一個大問題,但如果可能的話寧願修復:
########################################
Db2 不支持 OLAP 視窗聚合組子句上的 INTERVAL 關鍵字 https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.5.0/com.ibm.db2.luw.sql.ref.doc/ doc/r0023461.html 所以您需要先將 TIMESTAMP 轉換為 MINIUTE。例如
ID , "TIME" , "P/L" , SUM("P/L") OVER (PARTITION BY ID ORDER BY (DAYS("TIME") * 84000::BIGINT + MIDNIGHT_SECONDS("TIME"))/60 RANGE BETWEEN 10 PRECEDING AND CURRENT ROW) as ROLLING FROM TABLE(VALUES ('T1','2020-01-07-15.10.00',1.2) , ('T1','2020-01-07-15.25.00',2.2) , ('T1','2020-01-07-15.30.00',3.2) , ('T1','2020-01-07-15.40.00',4.2) ) AS T(ID, "TIME", "P/L")
回報
ID|TIME |P/L|ROLLING --|-------------------|---|------- T1|2020-01-07-15.10.00|1.2| 1.2 T1|2020-01-07-15.25.00|2.2| 2.2 T1|2020-01-07-15.30.00|3.2| 5.4 T1|2020-01-07-15.40.00|4.2| 7.4