Delen via


LAG (Azure Stream Analytics)

Met de analytische operator lag kan een 'vorige' gebeurtenis in een gebeurtenisstroom worden opgezoekt, binnen bepaalde beperkingen. Het is zeer nuttig voor het berekenen van de groeisnelheid van een variabele, detecteren wanneer een variabele een drempelwaarde overschrijdt of wanneer een voorwaarde begint of stopt met waar zijn.

In Stream Analytics is het bereik van LAG (dat wil gezegd, hoe ver terug in de geschiedenis van de huidige gebeurtenis die moet worden weergegeven) altijd beperkt tot een eindig tijdsinterval, met behulp van de component LIMIT DURATION. LAG kan optioneel worden beperkt tot alleen gebeurtenissen die overeenkomen met de huidige gebeurtenis op een bepaalde eigenschap of voorwaarde met behulp van de PARTITION BY- en WHEN-componenten.

LAG wordt niet beïnvloed door predicaten in de WHERE-component, joinvoorwaarden in de JOIN-component of groeperingsexpressies in de GROUP BY-component van de huidige query, omdat deze vóór deze componenten wordt geëvalueerd.

Syntax

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

Bijvoorbeeld:

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

Argumenten

scalar_expression

De waarde die moet worden geretourneerd op basis van de opgegeven offset. Het is een expressie van elk type die één (scalaire) waarde retourneert of de jokertekenexpressie '*'. Voor *wordt de hele gebeurtenis volgens de opgegeven offset geretourneerd en opgenomen in de resultaatgebeurtenis (geneste record).
scalar_expression mogen geen andere analytische functies of externe functies bevatten.

offset

Het aantal gebeurtenissen van de huidige gebeurtenis waaruit een waarde wordt opgehaald. Als dit niet is opgegeven, is de standaardwaarde 1, wat betekent dat de vorige gebeurtenis wordt geretourneerd. Verschuiving moet een geheel getal groter dan of gelijk aan 1 zijn. Gebeurtenissen worden verwerkt in tijdelijke volgorde. Als er meerdere gebeurtenissen met dezelfde tijdstempel zijn, worden gebeurtenissen in de volgorde van aankomst verwerkt.

standaardinstelling

De waarde die moet worden geretourneerd wanneer er geen gebeurtenis is op de opgegeven offset. Als er geen standaardwaarde is opgegeven, wordt NULL geretourneerd. 'Geen gebeurtenis op de opgegeven offset' kan het geval zijn 1) als het aantal bijbehorende gebeurtenissen dat tot nu toe is gezien kleiner is dan de opgegeven offset of 2) als er een time-out optreedt voor de gebeurtenis bij de opgegeven offset volgens de opgegeven limit_duration_clause 3) gebeurtenissen bestaan, maar niet overeenkomen met de booleaanse voorwaarde die is opgegeven in de when_clause.

Als de gebeurtenis op de opgegeven offset bestaat en de waarde van scalar_expression NULL is, dan NULL
wordt geretourneerd. standaard kan een kolom, subquery of andere expressie zijn, maar kan geen andere expressie bevatten
analytische functies of externe functies. standaard moet exact hetzelfde type hebben als
scalar_expression.

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause PARTITION BY <partitiesleutel-component> vraagt dat alleen gebeurtenissen waarvan de waarde van
<partitiesleutel> is dezelfde als die van de huidige gebeurtenis moet worden overwogen. Bijvoorbeeld

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

retourneert de vorige lezing van dezelfde sensor als de huidige gebeurtenis (als dit binnen de voorgaande 1 uur heeft plaatsgevonden).

limit_duration component DUUR(<eenheid>; <lengte>)

Hiermee geeft u op hoeveel van de geschiedenis van de huidige gebeurtenis moet worden overwogen. Zie DATEDIFF voor een gedetailleerde beschrijving van ondersteunde eenheden en hun afkortingen. Als er niet voldoende overeenkomende gebeurtenissen worden gevonden binnen het DUUR-interval, wordt de <standaardwaarde> geretourneerd.

when_clause
Hiermee geeft u de booleaanse voorwaarde op voor de gebeurtenissen die in de LAG-berekening moeten worden meegenomen. Als er niet voldoende overeenkomende gebeurtenissen worden gevonden binnen het DUUR-interval, wordt de <standaardwaarde> geretourneerd. De when_clause is optioneel.

Retourtypen

Het gegevenstype van de opgegeven scalar_expression. NULL wordt geretourneerd als scalar_expression

Algemene opmerkingen

LAG is niet-deterministisch. Gebeurtenissen worden verwerkt in tijdelijke volgorde. Als er meerdere gebeurtenissen met dezelfde tijdstempel zijn, worden gebeurtenissen in de volgorde van aankomst verwerkt.

Het toepassen van LAG op de resultatenset van een windowing-functie kan onverwachte resultaten opleveren. Vensterfuncties wijzigen de tijdstempel van gebeurtenissen, omdat elke vensterbewerking gebeurtenis aan het einde van het venster uitvoert. De huidige tijdstempel van een gebeurtenis kan worden geopend met system.timestamp(), na een vensterbewerking verschilt deze van het oorspronkelijke gebeurtenistijdkenmerk. Als LAG niet kan worden verplaatst vóór de vensterbewerking, kunt u CollectTop gebruiken, waarbij u rangschikt op de oorspronkelijke gebeurtenistijd.

Voorbeelden

Bereken de groeisnelheid per sensor:

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

Eerdere not-null-sensorlezing zoeken:

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

Zoeken naar eerdere niet-null-sensorwaarden voor een specifiek sensortype:

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

Bepalen wanneer een variabele een drempelwaarde overschrijdt:

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

Zie ook

ISFIRST (Azure Stream Analytics)
LAST (Azure Stream Analytics)