counter_diff 分析視窗函式

適用於:勾選標記為是 Databricks SQL 勾 選為是 Databricks 執行時間 19.0 及以上版本

計算時間序列中連續累積計數器值的差異,並將累積計數器轉換為 delta 格式。

Syntax

counter_diff( value [, start_time] ) OVER clause

Arguments

  • value:一個非負數值表達式,代表一個累積計數器。
  • start_time:一個可選TIMESTAMPTIMESTAMP_NTZ的運算式,指示計數器最後一次重置為零的時間。 用它來獨立於計數器值來表示計數器重置。
  • OVER 條款:描述視窗的條款。
    • PARTITION BY 來分開獨立的計數器。 典型的分割欄位包括度量名稱及與度量相關的屬性。
    • 用來 ORDER BY 定義順序。 這通常是與指標綁定的時間戳記欄位。

Returns

結果類型符合 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