適用対象:
Databricks SQL
Databricks Runtime 19.0 以降" とマークされているチェック
時系列内の連続した累積カウンター値の差を計算し、累積カウンターをデルタ形式に変換します。
Syntax
counter_diff( value [, start_time] ) OVER clause
引数
-
value: 累積カウンターを表す非負の数値式。 -
start_time: カウンタが最後にゼロにリセットされた日を示すオプションのTIMESTAMPまたはTIMESTAMP_NTZ式。 カウンターの値とは独立してカウンターのリセットをシグナルするために使うことができます。 -
OVER節:ウィンドウを記述する節です。
-
PARTITION BYを使って独立したカウンターを分離しましょう。 典型的なパーティション列は、メトリック名とメトリックに紐づく属性です。 -
ORDER BYを使って順序を定義してください。 これは通常、メトリクスに紐づいたタイムスタンプの列です。
-
返品
結果の型は value と一致します。
OVER節のORDER BYで定義された順序に従い、現在のカウンター値と前のカウンター値の差を返します。
この関数は以下の場合を扱います:
-
valueがNULLの場合、結果はNULLとなり、後の行の差分計算にはその行は使われません。 -
valueが負の場合、またはstart_timeが前の行のstart_timeより早い場合、誤Azure Databricksが生じます。 - パーティションの最初の行では、結果は
NULLとなります。 - カウンターリセットでは、結果は
NULLとなります。 - もし前回または現在の
start_timeがNULLされている場合、その値はカウンターリセットの検出には使われません。
Azure Databricksは、以下のいずれかが正しい場合にカウンターリセットを検出します。
- 前の
valueは現在のvalueよりも大きいです。 -
start_timeは提供され、前の行のstart_timeより大きい。
ORDER BY 句を指定する必要があります。
一般的なエラー状態
- COUNTER_DIFF_NEGATIVE_COUNTER_VALUE
- カウンター差分の開始時間が減少
- WINDOW_FUNCTION_WITHOUT_OVER_CLAUSE
- WINDOW_FUNCTION_FRAME_NOT_ORDERED
例示
> SELECT m, t, counter_diff(c) OVER (PARTITION BY m ORDER BY t)
FROM VALUES
('http_requests', TIMESTAMP '2026-01-01T00:00:00', 100),
('http_requests', TIMESTAMP '2026-01-01T00:01:00', 200),
('http_requests', TIMESTAMP '2026-01-01T00:02:00', 400)
AS tab(m, t, c);
http_requests 2026-01-01 00:00:00 NULL
http_requests 2026-01-01 00:01:00 100
http_requests 2026-01-01 00:02:00 200
-- Counter reset detected by a decrease in value
> SELECT m, t, counter_diff(c) OVER (PARTITION BY m ORDER BY t)
FROM VALUES
('http_requests', TIMESTAMP '2026-01-01T00:00:00', 100),
('http_requests', TIMESTAMP '2026-01-01T00:01:00', 200),
('http_requests', TIMESTAMP '2026-01-01T00:02:00', 400),
('http_requests', TIMESTAMP '2026-01-01T00:04:00', 50)
AS tab(m, t, c);
http_requests 2026-01-01 00:00:00 NULL
http_requests 2026-01-01 00:01:00 100
http_requests 2026-01-01 00:02:00 200
http_requests 2026-01-01 00:04:00 NULL
-- Counter reset detected by a change in start_time
> SELECT m, t, counter_diff(c, st) OVER (PARTITION BY m ORDER BY t)
FROM VALUES
('http_requests', TIMESTAMP '2026-01-01T00:01:00', TIMESTAMP '2026-01-01T00:00:00', 100),
('http_requests', TIMESTAMP '2026-01-01T00:02:00', TIMESTAMP '2026-01-01T00:00:00', 200),
('http_requests', TIMESTAMP '2026-01-01T00:04:00', TIMESTAMP '2026-01-01T00:02:31', 400)
AS tab(m, t, st, c);
http_requests 2026-01-01 00:01:00 NULL
http_requests 2026-01-01 00:02:00 100
http_requests 2026-01-01 00:04:00 NULL