counter_diff 分析ウィンドウ関数

適用対象:はい 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で定義された順序に従い、現在のカウンター値と前のカウンター値の差を返します。

この関数は以下の場合を扱います:

  • valueNULLの場合、結果はNULLとなり、後の行の差分計算にはその行は使われません。
  • valueが負の場合、またはstart_timeが前の行のstart_timeより早い場合、誤Azure Databricksが生じます。
  • パーティションの最初の行では、結果は NULLとなります。
  • カウンターリセットでは、結果は NULLとなります。
  • もし前回または現在の start_timeNULLされている場合、その値はカウンターリセットの検出には使われません。

Azure Databricksは、以下のいずれかが正しい場合にカウンターリセットを検出します。

  • 前の value は現在の valueよりも大きいです。
  • start_time は提供され、前の行の start_timeより大きい。

ORDER BY 句を指定する必要があります。

一般的なエラー状態

例示

> 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