LAST (Analisi di flusso di Azure)

L'operatore analitico LAST consente di cercare l'evento più recente in un flusso di eventi all'interno di vincoli definiti. È utile negli scenari come il calcolo dell'ultimo valore valido noto (ad esempio, non Null), la ricerca dell'ultima volta in cui l'evento corrisponde a determinati criteri e così via.

In Analisi di flusso, l'ambito di LAST (ovvero la distanza di tempo nella cronologia dall'evento corrente che deve cercare) è sempre limitato a un intervallo di tempo finito, usando la clausola LIMIT DURATION. LAST può essere facoltativamente limitato solo a eventi che corrispondono all'evento corrente in una determinata proprietà o condizione usando le clausole PARTITION BY e WHEN. LAST 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.

Osservazione: LAST(<expression>, <default>) è equivalente a LAG(<expression>, 0, <default>) (valore offset impostato su '0'). Si noti che LAG(<expression>, 0, <default>) non è effettivamente un costrutto valido perché LAG accetta un offset maggiore o uguale a 1. È quindi necessario usare l'operatore LAST, che è stato introdotto per praticità e una migliore leggibilità.

Sintassi

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

Argomenti

scalar_expression

Valore da restituire. È un'espressione di qualsiasi tipo che restituisce un singolo valore scalare oppure il carattere jolly '*'. Per '*' verrà restituito l'intero evento e sarà contenuto nell'evento di risultato (record annidato). scalar_expression non può contenere altre funzioni analitiche o esterne.

default

Valore da restituire quando non sono presenti criteri di corrispondenza degli eventi. Se non viene specificato un valore predefinito, viene restituito NULL. 'No event' può essere il caso se non sono presenti eventi precedenti entro l'intervallo di tempo specificato nel limit_duration_clause o l'evento esiste ma non corrisponde alla condizione specificata nel when_clause. Se l'evento esiste e il valore di scalar_expression è NULL, viene restituito NULL. default può essere una colonna, una sottoquery o un'altra espressione, ma non può contenere altre funzioni analitiche o funzioni esterne. default deve avere lo stesso tipo di scalar_expression.

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause La clausola partition BY <della chiave> di partizione richiede che solo gli eventi il cui valore di
<la chiave> di partizione è uguale a quella dell'evento corrente da considerare.

limit_duration_clause DURATION(<unit>, <length>):
Specifica la quantità di cronologia dell'evento corrente da considerare. Per una descrizione dettagliata delle unità supportate e delle rispettive abbreviazioni, vedere DATEDIFF. Se non vengono trovati eventi corrispondenti sufficienti entro l'intervallo DURATION, viene restituito il <valore predefinito> .

when_clause Specifica una condizione booleana per gli eventi da considerare nel calcolo LAST. Se non vengono trovati eventi corrispondenti entro l'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

LAST è 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 di LAST al set di risultati di una funzione windowing può produrre risultati imprevisti. Le funzioni di windowing modificano il timestamp degli eventi, in quanto ogni operazione finestra restituisce un evento alla fine della finestra. È possibile accedere al timestamp corrente di un evento con system.timestamp(), dopo un'operazione di finestra diversa dall'attributo ora dell'evento originale. Se LAST non può essere spostato prima dell'operazione della finestra, è consigliabile usare CollectTop, ordinando in base all'ora dell'evento originale.

Esempio

Trovare la lettura del sensore non Null più recente:

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

Trovare l'ultima volta in cui la lettura è maggiore di 50:

SELECT
       sensorId,
       LAST(System.Timestamp()) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading > 50 )
FROM input 

Vedere anche

ISFIRST (Analisi dei flussi di Azure)
LAG (Analisi di flusso di Azure)