ZAOSTÁVAT

✅Eventstream prostředků infrastruktury Azure Stream Analytics ✅

Analytický operátor LAG umožňuje vyhledat "předchozí" událost v datovém proudu událostí v určitých omezeních. Je velmi užitečné pro výpočet míry růstu proměnné, zjištění, kdy proměnná překročí prahovou hodnotu nebo kdy podmínka začíná nebo přestane být pravdivá.

V Stream Analytics je rozsah LAG (tj. jak daleko zpět v historii od aktuální události, kterou potřebuje hledat), vždy omezen na konečný časový interval pomocí klauzule LIMIT DURATION. Prodleva může být volitelně omezena pouze na události, které odpovídají aktuální události v určité vlastnosti nebo podmínce pomocí klauzulí PARTITION BY a WHEN.

PRODLEVa není ovlivněna predikáty v klauzuli WHERE, podmínky spojení v klauzuli JOIN nebo seskupování výrazů v klauzuli GROUP BY aktuálního dotazu, protože se vyhodnocuje před těmito klauzulemi.

Syntaxe

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

Například:

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

Argumenty

scalar_expression

Hodnota, která se má vrátit na základě zadaného posunu. Jedná se o výraz libovolného typu, který vrací jednu (skalární) hodnotu, nebo výraz se zástupným znakem *. Pro *bude vrácena celá událost podle zadaného posunu a bude obsažena ve výsledné události (vnořeném záznamu).
scalar_expression nemůže obsahovat jiné analytické funkce ani externí funkce.

ofset

Počet událostí zpět z aktuální události, ze které chcete získat hodnotu. Pokud není zadáno, výchozí hodnota je 1, což znamená, že vrátí předchozí událost. Odsazení musí být celé číslo větší nebo rovno 1. Události se zpracovávají v časovém pořadí. Pokud existuje několik událostí se stejným časovým razítkem, zpracovávají se v pořadí doručení.

výchozí

Hodnota, která se má vrátit, když v zadaném posunu není žádná událost. Pokud není zadána výchozí hodnota, vrátí se hodnota NULL. "Žádná událost na zadaném posunu" nemůže být případ 1) pokud počet odpovídajících událostí, které jsou dosud zobrazeny, menší než zadaný posun nebo 2) pokud událost v zadaném posunu je časový limit podle zadané limit_duration_clause 3) události existují, ale neodpovídají logické podmínce zadané v when_clause.

Pokud událost na zadaném posunu existuje a hodnota scalar_expression má hodnotu NULL, hodnota NULL
je vrácena. výchozí hodnota může být sloupec, poddotaz nebo jiný výraz, ale nemůže obsahovat jiný výraz.
analytické funkce nebo externí funkce. výchozí hodnota musí mít stejný typ jako
scalar_expression.

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause KLAUZULE PARTITION BY <klíč> oddílu vyžaduje pouze události, jejichž hodnota
<Klíč> oddílu je stejný jako klíč aktuální události. Příklad:

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

vrátí předchozí čtení stejného senzoru jako aktuální událost (pokud k tomu došlo během předchozí 1 hodiny).

klauzule limit_duration DURATION(<jednotka>; <délka>)

Určuje, kolik historie z aktuální události je třeba zvážit. Podrobný popis podporovaných jednotek a jejich zkratek najdete v tématu DATEDIFF. Pokud se v intervalu DOBY TRVÁNÍ nenajde dostatek odpovídajících událostí, <vrátí se výchozí> hodnota.

when_clause
Určuje logickou podmínku pro události, které se mají brát v úvahu při výpočtu LAG. Pokud se v intervalu DOBY TRVÁNÍ nenajde dostatek odpovídajících událostí, <vrátí se výchozí> hodnota. When_clause je nepovinný.

Návratové typy

Datový typ zadaného scalar_expression. Pokud scalar_expression, vrátí se hodnota NULL.

Obecné poznámky

LAG je nedeterministické. Události se zpracovávají v časovém pořadí. Pokud existuje několik událostí se stejným časovým razítkem, zpracovávají se v pořadí doručení.

Použití prodlevy u sady výsledků funkce okna může vést k neočekávaným výsledkům. Funkce oken mění časové razítko událostí, protože každá operace okna vypíše událost na konci okna. K aktuálnímu časovému razítku události lze získat přístup pomocí system.timestamp() po operaci okna, která se bude lišit od původního atributu času události. Pokud před operací okna nejde přesunout prodlevu, zvažte použití funkce CollectTop a řazení podle původního času události.

Příklady

Výpočet míry růstu na senzor:

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

Vyhledání předchozího čtení senzoru not-null:

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

Vyhledejte předchozí nenulové čtení senzoru pro konkrétní typ senzoru:

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

Určete, kdy proměnná překročí prahovou hodnotu:

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

Viz také

ISFIRST
POSLEDNÍ