Db2

DB2 視窗函式 - 在前 N 分鐘的行中執行總計 X

  • January 8, 2020

對視窗功能非常陌生,但我想我明白了。

我試圖以 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

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