LAG (Azure Stream Analytics)

Operator analityczny LAG umożliwia wyszukiwanie "poprzedniego" zdarzenia w strumieniu zdarzeń w ramach określonych ograniczeń. Jest to bardzo przydatne podczas obliczania szybkości wzrostu zmiennej, wykrywania, gdy zmienna przekracza próg, lub gdy warunek zaczyna się lub przestaje być spełniony.

W usłudze Stream Analytics zakres LAG (czyli jak daleko w historii z bieżącego zdarzenia, które musi wyglądać) jest zawsze ograniczony do skończonego interwału czasu przy użyciu klauzuli LIMIT DURATION. Opóźnienie może być opcjonalnie ograniczone tylko do zdarzeń, które pasują do bieżącego zdarzenia w określonej właściwości lub warunku przy użyciu klauzul PARTITION BY i WHEN.

LAG nie ma wpływu na predykaty w klauzuli WHERE, warunków sprzężenia w klauzuli JOIN lub wyrażeń grupowania w klauzuli GROUP BY bieżącego zapytania, ponieważ jest obliczana przed tymi klauzulami.

Składnia

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

Przykład:

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

Argumenty

Scalar_expression

Wartość, która ma zostać zwrócona na podstawie określonego przesunięcia. Jest to wyrażenie dowolnego typu zwracające pojedynczą (skalarną) wartość lub wyrażenie wieloznaczne "*". W przypadku ciągu "*" całe zdarzenie zgodnie z określonym przesunięciem zostanie zwrócone i będzie zawarte w zdarzeniu wyniku (zagnieżdżony rekord).
scalar_expression nie może zawierać innych funkcji analitycznych ani funkcji zewnętrznych.

Przesunięcie

Liczba zdarzeń z powrotem z bieżącego zdarzenia, z którego ma być uzyskiwana wartość. Jeśli nie zostanie określony, wartość domyślna to 1, co oznacza, że zwraca poprzednie zdarzenie. Przesunięcie musi być liczbą całkowitą większą lub równą 1. Zdarzenia są przetwarzane w kolejności czasowej. Jeśli istnieje kilka zdarzeń z tymi samymi zdarzeniami sygnatury czasowej, są przetwarzane w kolejności przyjazdu.

default

Wartość, która ma być zwracana, gdy nie ma żadnego zdarzenia w określonym przesunięciu. Jeśli nie określono wartości domyślnej, zwracana jest wartość NULL. "Nie ma zdarzenia w określonym przesunięcie" może mieć wielkość 1) jeśli liczba odpowiadających zdarzeń widocznych do tej pory jest mniejsza niż określone przesunięcie lub 2), jeśli zdarzenie z określonego przesunięcia zostanie przekroczone zgodnie z określonym limit_duration_clause 3) zdarzenia istnieją, ale nie są zgodne z warunkiem logicznym określonym w when_clause.

Jeśli zdarzenie w określonym przesunięcie istnieje, a wartość scalar_expression ma wartość NULL, wartość NULL
. wartość domyślna może być kolumną, podquery lub innym wyrażeniem, ale nie może zawierać innego wyrażenia
funkcje analityczne lub funkcje zewnętrzne. wartość domyślna musi mieć dokładnie taki sam typ jak
Scalar_expression.

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause KLAUZULA PARTITION BY <partition key> żąda tylko zdarzeń, których wartość
<klucz> partycji jest taki sam jak w przypadku bieżącego zdarzenia, które należy uwzględnić. Na przykład

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

zwróci poprzedni odczyt tego samego czujnika co bieżące zdarzenie (jeśli takie miało miejsce w ciągu poprzedniej 1 godziny).

klauzula limit_duration DURATION(<jednostka>, <długość>)

Określa, ile historii z bieżącego zdarzenia należy uwzględnić. Zobacz DATEDIFF, aby uzyskać szczegółowy opis obsługiwanych jednostek i ich skrótów. Jeśli w interwale CZASU znaleziono za mało pasujących zdarzeń, <zwracana jest wartość domyślna> .

when_clause
Określa warunek logiczny dla zdarzeń, które mają być brane pod uwagę w obliczeniach LAG. Jeśli w interwale CZASU znaleziono za mało pasujących zdarzeń, <zwracana jest wartość domyślna> . When_clause jest opcjonalny.

Typy zwracane

Typ danych określonego scalar_expression. Wartość NULL jest zwracana, jeśli scalar_expression

Uwagi ogólne

LAG jest nieokreślone. Zdarzenia są przetwarzane w kolejności czasowej. Jeśli istnieje kilka zdarzeń z tymi samymi zdarzeniami sygnatury czasowej, są przetwarzane w kolejności przyjazdu.

Zastosowanie funkcji LAG w zestawie wyników funkcji okien może spowodować nieoczekiwane wyniki. Funkcje okien zmieniają sygnaturę czasową zdarzeń, ponieważ każda operacja okna generuje zdarzenie na końcu okna. Dostęp do bieżącej sygnatury czasowej zdarzenia można uzyskać za pomocą atrybutu system.timestamp(), po operacji okna różni się od oryginalnego atrybutu czasu zdarzenia. Jeśli nie można przenieść funkcji LAG przed operacją okna, rozważ użycie funkcji CollectTop, porządkowanie według oryginalnego czasu zdarzenia.

Przykłady

Oblicz szybkość wzrostu na czujnik:

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

Znajdź poprzedni odczyt czujnika not-null:

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

Znajdź poprzedni odczyt czujnika o wartości innej niż null dla określonego typu czujnika:

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

Określ, kiedy zmienna przekracza próg:

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

Zobacz też

ISFIRST (Azure Stream Analytics)
OSTATNI (Azure Stream Analytics)