Freigeben über


ZURÜCKBLEIBEN

✅ Azure Stream Analytics ✅ Fabric Eventstream

Der LAG-Analyseoperator ermöglicht es einem, innerhalb bestimmter Einschränkungen ein "vorheriges" Ereignis in einem Ereignisdatenstrom nachzuschlagen. Es ist sehr nützlich, die Wachstumsrate einer Variablen zu berechnen, zu erkennen, wann eine Variable einen Schwellenwert überschreitet oder wenn eine Bedingung beginnt oder anhält, wahr zu sein.

In Stream Analytics ist der Bereich der LAG (d. h., wie weit zurück in der Historie des aktuellen Ereignisses es aussehen muss) immer auf ein endliches Zeitintervall beschränkt, wobei die LIMIT DURATION-Klausel verwendet wird. Lag kann optional nur auf Ereignisse beschränkt werden, die mit dem aktuellen Ereignis für eine bestimmte Eigenschaft oder Bedingung mit den PARTITION BY- und WHEN-Klauseln übereinstimmen.

Die LAG ist von Prädikaten in der WHERE-Klausel, Verknüpfungsbedingungen in der JOIN-Klausel oder gruppieren von Ausdrücken in der GROUP BY-Klausel der aktuellen Abfrage nicht betroffen, da sie vor diesen Klauseln ausgewertet wird.

Syntax

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

Beispiel:

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

Argumente

scalar_expression

Der zurückzugebende Wert auf Grundlage des angegebenen Offsets. Es handelt sich entweder um einen Ausdruck eines beliebigen Typs, der einen einzelnen (skalaren) Wert oder den Wildcardausdruck '*' zurückgibt. Für '*' wird das gesamte Ereignis gemäß dem angegebenen Offset zurückgegeben und im Ergebnisereignis (geschachtelter Datensatz) enthalten sein.
scalar_expression dürfen keine anderen Analysefunktionen oder externen Funktionen enthalten.

Offset

Die Anzahl der Ereignisse zurück vom aktuellen Ereignis, aus dem ein Wert abgerufen werden soll. Wenn nicht angegeben, ist der Standardwert 1, was bedeutet, dass es das vorherige Ereignis zurückgibt. Offset muss eine ganze Zahl größer oder gleich 1 sein. Ereignisse werden in zeitlicher Reihenfolge verarbeitet. Wenn mehrere Ereignisse mit demselben Zeitstempelereignisse in der Reihenfolge der Ankunft verarbeitet werden.

Vorgabe

Der Wert, der zurückgegeben werden soll, wenn kein Ereignis am angegebenen Offset vorhanden ist. Wenn kein Standardwert angegeben ist, wird NULL zurückgegeben. "Kein Ereignis am angegebenen Offset" kann der Fall 1) sein, wenn die Anzahl der bisher angezeigten entsprechenden Ereignisse kleiner als der angegebene Offset oder 2 ist, wenn das Ereignis am angegebenen Offset entsprechend den angegebenen limit_duration_clause 3)-Ereignissen timed out ist, aber nicht mit booleschen Bedingungen übereinstimmen, die in der when_clause angegeben sind.

Wenn das Ereignis am angegebenen Offset vorhanden ist und der Wert von scalar_expression NULL ist, dann NULL
wird zurückgegeben. Der Standardwert kann eine Spalte, Unterabfrage oder ein anderer Ausdruck sein, kann aber keine andere enthalten.
Analysefunktionen oder externe Funktionen. Der Standardwert muss den gleichen Typ aufweisen wie
scalar_expression.

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause PARTITION BY-Partitionsschlüsselklausel <> fordert nur Ereignisse an, deren Wert
<Partitionsschlüssel> ist identisch mit dem des aktuellen Ereignisses. Beispiel:

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

gibt den vorherigen Lesewert desselben Sensors wie das aktuelle Ereignis zurück (wenn diese innerhalb der vorherigen 1 Stunde aufgetreten sind).

limit_duration-Klausel DURATION(<Einheit>; <Länge>)

Gibt an, wie viel der Verlauf aus dem aktuellen Ereignis berücksichtigt werden muss. Eine detaillierte Beschreibung der unterstützten Einheiten und deren Abkürzungen finden Sie unter DATEDIFF. Wenn nicht genügend übereinstimmende Ereignisse innerhalb des DURATION-Intervalls gefunden werden, wird der <Standardwert> zurückgegeben.

when_clause
Gibt eine boolesche Bedingung für die Ereignisse an, die bei der LAG-Berechnung berücksichtigt werden sollen. Wenn nicht genügend übereinstimmende Ereignisse innerhalb des DURATION-Intervalls gefunden werden, wird der <Standardwert> zurückgegeben. Die when_clause ist optional.

Rückgabetypen

Der Datentyp des angegebenen scalar_expression. NULL wird zurückgegeben, wenn scalar_expression

Allgemeine Hinweise

LAG ist nicht deterministisch. Ereignisse werden in zeitlicher Reihenfolge verarbeitet. Wenn mehrere Ereignisse mit demselben Zeitstempelereignisse in der Reihenfolge der Ankunft verarbeitet werden.

Das Anwenden von LAG auf das Resultset einer Fensterfunktion kann zu unerwarteten Ergebnissen führen. Fensterfunktionen ändern den Zeitstempel von Ereignissen, da jedes Fenstervorgang das Ereignis am Ende des Fensters ausgibt. Auf den aktuellen Zeitstempel eines Ereignisses kann mit "system.timestamp()" zugegriffen werden, nachdem ein Fenstervorgang ausgeführt wurde, unterscheidet es sich vom ursprünglichen Ereigniszeit-Attribut. Wenn lag vor dem Fenstervorgang nicht verschoben werden kann, erwägen Sie die Verwendung von CollectTop, sortierung nach der ursprünglichen Ereigniszeit.

Beispiele

Berechnen sie die Wachstumsrate pro Sensor:

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

Vorheriger Nicht-Null-Sensorwert finden:

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

Finden Sie vorherige Nicht-Null-Sensorlesewerte für einen bestimmten Sensortyp:

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

Bestimmen Sie, wann eine Variable einen Schwellenwert überschreitet:

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

Siehe auch

ISFIRST
LETZTE