web-dev-qa-db-ja.com

DB2ウィンドウ関数-前のN分の行の合計Xを実行

ウィンドウ関数は非常に新しいですが、私は考えを理解していると思います。

1つの列のローリング合計を10分間隔で取得しようとしています(別のタイムスタンプ列から決定)

作業サンプルは次のようになります。

EDIT:フィドルリンク

enter image description here

T2用にフィルター処理すると、より適切に強調表示されます。

enter image description here

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)があります。マイクロ秒を引き戻してこれを解決できると思いましたが、残念ながらこれらは保存されていません。

私たちは、大きな問題ではないかもしれませんが、可能であれば修正したい、だまされた人の奇妙な逆算の合計で終わります:

enter image description here

########################################

1
DublinMeUp

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
3
Paul Vernon

タイムスタンプを数値に変換した後は、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で機能します 以降です。

1
mustaccio