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