ウィンドウ関数は非常に新しいですが、私は考えを理解していると思います。
1つの列のローリング合計を10分間隔で取得しようとしています(別のタイムスタンプ列から決定)
作業サンプルは次のようになります。
EDIT:フィドルリンク
T2用にフィルター処理すると、より適切に強調表示されます。
this または this および so on のようなトピックについてはたくさんありますが、自分の要件に固有のソリューションを見つけるのに苦労しています。
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分の制約を追加することは不可能ですか?
############## EDIT TWO ##############
わかりましたので、私は問題を理解し、それを fiddle で再現することに成功しました
実際のテーブルには有効な重複トランザクション(同じIDとTIME)があります。マイクロ秒を引き戻してこれを解決できると思いましたが、残念ながらこれらは保存されていません。
私たちは、大きな問題ではないかもしれませんが、可能であれば修正したい、だまされた人の奇妙な逆算の合計で終わります:
########################################
Db2は、OLAP window-aggregation-group-clause https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.5.0/comのINTERVALキーワードをサポートしていません。 .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
タイムスタンプを数値に変換した後は、RANGE
ではなくROWS
を使用します。
SELECT ID, tm, P/L,
SUM(P/L) OVER (PARTITION BY ID
ORDER BY extract(Epoch from tm)
range BETWEEN 600 PRECEDING AND CURRENT ROW) as ROLLING
FROM tbl
これは LUW 11.1のDb2で機能します 以降です。