LAG (Azure Stream Analytics)

LAG 分析運算子允許在特定條件約束內查詢事件資料流程中的「上一個」事件。 它非常適用于計算變數成長率、偵測變數何時超出臨界值,或條件何時啟動或停止為 true。

在串流分析中,LAG (的範圍,也就是使用 LIMIT DURATION 子句,從目前事件回溯到目前事件) 的時間長度一律受限於有限時間間隔。 LAG 可以選擇性地限制為只考慮使用 PARTITION BY 和 WHEN 子句,符合特定屬性或條件上目前事件的事件。

LAG 不會受到 WHERE 子句中的述詞、JOIN 子句中的聯結條件或目前查詢 GROUP BY 子句中的運算式所影響,因為它會在那些子句之前進行評估。

Syntax

LAG(<scalar_expression >, [<offset >], [<default>])  
     OVER ([PARTITION BY <partition key>] LIMIT DURATION(<unit>, <length>) [WHEN boolean_expression])
  

例如:

LAG(reading) OVER (LIMIT DURATION(hour, 3))  
LAG(name, 2, 'none such') OVER (PARTITION BY userId LIMIT DURATION(minute, 2))  

引數

scalar_expression

根據指定的位移傳回數值。 它會是傳回單一 (純量) 值的任何類型的運算式或萬用字元運算式 ‘*’。 對於 '*',會根據指定的位移傳回整個事件,並將包含在結果事件中 (巢狀記錄) 。
scalar_expression 不能包含其他分析函數或外部函數。

offset

要從中取得值之從目前的事件傳回的事件數目。 如果未指定,預設值為 1,這表示它會傳回先前的事件。 Offset 必須是大於或等於 1 的整數。 事件是以時間順序進行處理。 如果有多個具有相同時間戳記的事件,則會以到達順序來處理事件。

預設值

指定位移沒有任何事件時要傳回的值。 如果未指定預設值,會傳回 NULL。 如果目前所看見的對應事件數目小於指定的位移,或 2) 指定位移的事件根據指定的limit_duration_clause 3) 事件存在,但不符合when_clause中指定的布林值條件,則 'No event at the specified offset' 可以是 1) 。

如果位於指定位移的事件存在,且 scalar_expression 的值為 Null,則為 Null
」錯誤訊息。 default 可以是資料行、子查詢或其他運算式,但不能包含其他運算式
分析函式或外部函式。 default 的類型必須與 完全相同
scalar_expression。

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause PARTITION BY < 分割區索引鍵 > 子句只會要求其值為的事件
<分割區索引鍵與目前事件的索引鍵 > 相同。 例如,

LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))  

如果在 1) 小時內發生,則會傳回與目前事件相同的感應器先前讀取 (。

limit_duration 子句 DURATION (< 單位 > , < 長度 >)

指定目前事件中必須考慮多少歷程記錄。 如需支援單位及其縮寫的詳細說明,請參閱 DATEDIFF。 如果在 DURATION 間隔內找不到足夠的相符事件, < 則會傳回預設值 > 。

when_clause
指定要在 LAG 計算中考慮之事件的布林條件。 如果在 DURATION 間隔內找不到足夠的相符事件, < 則會傳回預設值 > 。 when_clause是選擇性的。

傳回型別

指定的 scalar_expression 的資料類型。 如果 scalar_expression 則傳回 NULL

一般備註

LAG 不具決定性。 事件是以時間順序進行處理。 如果有多個具有相同時間戳記的事件,則會以到達順序來處理事件。

視窗化 函式的結果集上套用 LAG 可能會產生非預期的結果。 視窗化函式會改變事件的時間戳記,因為每個視窗作業都會在視窗結尾輸出事件。 在視窗作業之後,可以使用 system.timestamp () 存取事件的目前時間戳記,其與原始事件時間屬性不同。 如果 LAG 無法在視窗作業之前移動,請考慮使用 CollectTop,依原始事件時間排序。

範例

計算每個感應器的成長率:

SELECT sensorId,  
       growth = reading -
                        LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))  
FROM input  
  

尋找先前非 Null 感應器讀數:

SELECT  
     sensorId,  
     LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading IS NOT NULL)  
     FROM input  
  

尋找特定感應器類型的先前非 Null 感應器讀取:

WITH filterSensor AS
(
  SELECT *
  FROM input
  WHERE input.sensorType = 4 AND sensorId IS NOT NULL
)

SELECT
  LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))
FROM filterSensor

判斷變數何時超過臨界值:

SELECT
    sensorId, reading
FROM input
WHERE
    devicetype = 'thermostat'
    AND reading > 100
    AND LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN devicetype = 'thermostat') <= 100

另請參閱

ISFIRST (Azure Stream Analytics)
上次 (Azure 串流分析)