LAG (Analisi di flusso di Azure)
L'operatore di analisi laG consente di cercare un evento "precedente" in un flusso di eventi, all'interno di determinati vincoli. È molto utile per calcolare il tasso di crescita di una variabile, rilevando quando una variabile supera una soglia o quando una condizione inizia o smette di essere true.
In Analisi di flusso, l'ambito del laG (ovvero, quanto indietro nella cronologia dall'evento corrente deve essere esaminato) è sempre limitato a un intervallo di tempo limitato, usando la clausola LIMIT DURATION. Il lag può essere facoltativamente limitato solo a considerare gli eventi che corrispondono all'evento corrente in una determinata proprietà o condizione usando le clausole PARTITION BY e WHEN.
LaG non è interessato dai predicati nella clausola WHERE, dalle condizioni di join nella clausola JOIN o dalle espressioni di raggruppamento nella clausola GROUP BY della query corrente perché viene valutata prima di tali clausole.
Sintassi
LAG(<scalar_expression >, [<offset >], [<default>])
OVER ([PARTITION BY <partition key>] LIMIT DURATION(<unit>, <length>) [WHEN boolean_expression])
Ad esempio:
LAG(reading) OVER (LIMIT DURATION(hour, 3))
LAG(name, 2, 'none such') OVER (PARTITION BY userId LIMIT DURATION(minute, 2))
Argomenti
scalar_expression
Valore da restituire basato sull'offset specificato. È un'espressione di qualsiasi tipo che restituisce un singolo valore scalare oppure il carattere jolly '*'. Per '*' l'intero evento in base all'offset specificato verrà restituito e verrà contenuto nell'evento risultato (record annidato).
scalar_expression non può contenere altre funzioni analitiche o esterne.
offset
Numero degli eventi a partire da quello corrente da cui ottenere un valore. Se non specificato, il valore predefinito è 1, il che significa che restituisce l'evento precedente. L'offset deve essere un intero maggiore o uguale a 1. Gli eventi vengono elaborati in ordine temporale. Se sono presenti più eventi con lo stesso timestamp, tali eventi vengono elaborati nell'ordine di arrivo.
default
Valore da restituire quando non ci sono eventi in corrispondenza dell'offset specificato. Se non viene specificato un valore predefinito, viene restituito NULL. "Nessun evento all'offset specificato" può essere il caso 1) se il numero di eventi corrispondenti visti finora è minore dell'offset specificato o 2) se l'evento all'offset specificato viene timeout in base agli eventi specificati limit_duration_clause 3) esistono ma non corrispondono alla condizione booleana specificata nella when_clause.
Se l'evento in corrispondenza dell'offset specificato esiste e il valore di scalar_expression è NULL, NULL
un errore imprevisto". il valore predefinito può essere una colonna, una sottoquery o un'altra espressione, ma non può contenere altre
funzioni analitiche o funzioni esterne. il valore predefinito deve avere lo stesso tipo di
scalar_expression.
OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])
partition_by_clause La clausola PARTITION BY <partition key> richiede solo eventi il cui valore di
<la chiave> di partizione è uguale a quella dell'evento corrente. Ad esempio,
LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))
restituirà la lettura precedente dello stesso sensore dell'evento corrente (se tale evento si è verificato entro l'ora precedente).
clausola limit_duration DURATION(<unit>, <length>)
Specifica la quantità di cronologia dell'evento corrente. Per una descrizione dettagliata delle unità supportate e delle rispettive abbreviazioni, vedere DATEDIFF. Se non sono presenti eventi corrispondenti sufficienti all'interno dell'intervallo DURATION, viene restituito il <valore predefinito> .
when_clause
Specifica la condizione booleana per gli eventi da considerare nel calcolo di LAG. Se non sono presenti eventi corrispondenti sufficienti all'interno dell'intervallo DURATION, viene restituito il <valore predefinito> . Il when_clause è facoltativo.
Tipi restituiti
Tipo di dati del parametro scalar_expression specificato. Viene restituito NULL se è scalar_expression.
Osservazioni generali
LAG è non deterministico. Gli eventi vengono elaborati in ordine temporale. Se sono presenti più eventi con lo stesso timestamp, tali eventi vengono elaborati nell'ordine di arrivo.
L'applicazione del ritardo sul set di risultati di una funzione di finestra può produrre risultati imprevisti. Le funzioni di finestra modificano il timestamp degli eventi, poiché ogni evento dell'operazione finestra restituisce l'evento alla fine della finestra. Il timestamp corrente di un evento può essere accessibile con system.timestamp(), dopo un'operazione di finestra diversa dall'attributo ora dell'evento originale. Se non è possibile spostare LAG prima dell'operazione di finestra, prendere in considerazione l'uso di CollectTop, ordinando in base all'ora dell'evento originale.
Esempio
Calcolare il tasso di crescita, per sensore:
SELECT sensorId,
growth = reading -
LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))
FROM input
Trovare la lettura del sensore not-null precedente:
SELECT
sensorId,
LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading IS NOT NULL)
FROM input
Trovare la lettura precedente del sensore non Null per un tipo di sensore specifico:
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
Determinare quando una variabile supera una soglia:
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
Vedere anche
ISFIRST (Analisi dei flussi di Azure)
LAST (Analisi di flusso di Azure)