LAST (Azure Stream Analytics)
Med operatorn LAST analytic kan en slå upp den senaste händelsen i en händelseström inom definierade begränsningar. Det är användbart i scenarier som att beräkna senast kända bra värde (t.ex. inte null), hitta senaste gången när händelsen matchade vissa kriterier osv.
I Stream Analytics är omfånget LAST (det vill s.v.s. hur långt tillbaka i historiken från den aktuella händelsen den måste se ut) alltid begränsat till ett begränsat tidsintervall med hjälp av LIMIT DURATION-satsen. LAST kan också begränsas till att endast överväga händelser som matchar den aktuella händelsen på en viss egenskap eller ett visst villkor med hjälp av PARTITION BY- och WHEN-satserna. LAST påverkas inte av predikat i WHERE-satsen, kopplingsvillkor i JOIN-satsen eller grupperingsuttryck i GROUP BY-satsen i den aktuella frågan.
Anmärkning: LAST(<expression>, <default>) är ekvivalent till LAG(<expression>, 0, <default>) (som är förskjutningsvärde inställt på '0'). Observera att LAG(<expression>, 0, <default>) faktiskt inte är en giltig konstruktion eftersom LAG tar en förskjutning större eller lika med 1. Därför måste du använda LAST-operatorn i stället, vilket introducerades för bekvämlighet och bättre läsbarhet.
Syntax
LAST(<scalar_expression >, [<default>])
OVER ( [PARTITION BY <partition key>] LIMIT DURATION(<unit>, <length>) [WHEN boolean_expression])
Argument
scalar_expression
Det värde som ska returneras. Det är antingen ett uttryck av valfri typ som returnerar ett enskilt (skalärt) värde eller jokertecknet "*". För *returneras hela händelsen och kommer att finnas i resultathändelsen (kapslad post). scalar_expression får inte innehålla andra analysfunktioner eller externa funktioner.
standard
Det värde som ska returneras när det inte finns några villkor för händelsematchning. Om inget standardvärde anges returneras NULL. "Ingen händelse" kan vara fallet om det inte finns några tidigare händelser inom det tidsintervall som anges i limit_duration_clause eller om händelsen finns men inte matchar villkoret som anges i when_clause. Om händelsen finns och värdet för scalar_expression är NULL returneras NULL. standardvärdet kan vara en kolumn, en underfråga eller ett annat uttryck, men det får inte innehålla andra analysfunktioner eller externa funktioner. standard måste ha exakt samma typ som scalar_expression.
ÖVER ( [ partition_by_clause ] limit_duration_clause [when_clause])
partition_by_clause PARTITION BY-partitionsnyckelsatsen <> begär att endast händelser vars värde för
<partitionsnyckeln> är samma som för den aktuella händelsen.
limit_duration_clause DURATION(<enhet>, <längd>):
Anger hur mycket av historiken från den aktuella händelsen som måste beaktas. Se DATEDIFF för en detaljerad beskrivning av enheter som stöds och deras förkortningar. Om det inte finns tillräckligt med matchande händelser inom VARAKTIGHETsintervallet <returneras standardvärdet> .
when_clause Anger booleskt villkor för de händelser som ska beaktas i DEN SENASTE beräkningen. Om inga matchande händelser hittas inom VARAKTIGHETsintervallet <returneras standardvärdet> . Det when_clause är valfritt.
Returtyper
Datatypen för den angivna scalar_expression. NULL returneras om scalar_expression
Allmänna kommentarer
LAST är icke-deterministisk. Händelser bearbetas i tidsordning. Om det finns flera händelser med samma tid behandlas stämpelhändelser i ankomstordningen.
Om du använder LAST på resultatuppsättningen för en fönsterfunktion kan det ge oväntade resultat. Fönsterfunktionerna ändrar tidsstämpeln för händelser, eftersom varje fönsteråtgärd matar ut händelsen i slutet av fönstret. Den aktuella tidsstämpeln för en händelse kan nås med system.timestamp(), efter en fönsteråtgärd skiljer den sig från det ursprungliga attributet för händelsetid. Om LAST inte kan flyttas före fönsteråtgärden bör du överväga att använda CollectTop och beställa efter den ursprungliga händelsetiden.
Exempel
Hitta den senaste sensoravläsningen som inte är null:
SELECT
sensorId,
LAST(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading IS NOT NULL)
FROM input
Hitta senaste gången när läsningen var större än 50:
SELECT
sensorId,
LAST(System.Timestamp()) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading > 50 )
FROM input
Se även
ISFIRST (Azure Stream Analytics)
LAG (Azure Stream Analytics)