LAG (Azure Stream Analytics)
A LAG analitikus operátor lehetővé teszi, hogy bizonyos korlátozásokon belül megkeressen egy "előző" eseményt egy eseménystreamben. Nagyon hasznos egy változó növekedési sebességének kiszámításához, annak észleléséhez, ha egy változó átlép egy küszöbértéket, vagy amikor egy feltétel elindul vagy leáll.
A Stream Analyticsben a LAG hatóköre (azaz hogy milyen messze van az előzményekben az aktuális eseménytől, amelyet meg kell néznie) mindig véges időintervallumra van korlátozva a LIMIT DURATION záradék használatával. A LAG opcionálisan korlátozható úgy, hogy csak azokat az eseményeket vegye figyelembe, amelyek megfelelnek egy adott tulajdonság vagy feltétel aktuális eseményének a PARTITION BY és a WHEN záradékok használatával.
A LAG-t nem érintik a WHERE záradék predikátumai, a JOIN záradék illesztési feltételei vagy az aktuális lekérdezés GROUP BY záradékában található csoportosítási kifejezések, mivel azokat a záradékok előtt értékeli ki a program.
Syntax
LAG(<scalar_expression >, [<offset >], [<default>])
OVER ([PARTITION BY <partition key>] LIMIT DURATION(<unit>, <length>) [WHEN boolean_expression])
Ilyenek például a következők:
LAG(reading) OVER (LIMIT DURATION(hour, 3))
LAG(name, 2, 'none such') OVER (PARTITION BY userId LIMIT DURATION(minute, 2))
Argumentumok
scalar_expression
A visszaadandó érték a megadott eltolás alapján. Bármilyen típusú kifejezés, amely egyetlen (skaláris) értéket ad vissza, vagy a "*" helyettesítő karaktert adja vissza. A (*) esetében a rendszer a megadott eltolásnak megfelelő teljes eseményt adja vissza, és az eredményeseményben (beágyazott rekordban) szerepel.
scalar_expression nem tartalmazhat más elemzési függvényeket vagy külső függvényeket.
offset
Az aktuális eseményből visszahozott események száma, amelyekből értéket szeretne lekért. Ha nincs megadva, az alapértelmezett érték 1, ami azt jelenti, hogy az előző eseményt adja vissza. Az eltolásnak 1-nél nagyobb vagy egyenlő egész számnak kell lennie. Az események feldolgozása időbeli sorrendben történik. Ha több, azonos időbélyeggel rendelkező esemény is van, a rendszer érkezési sorrendben dolgozza fel az eseményeket.
alapértelmezett
A visszaadandó érték, ha a megadott eltolásnál nincs esemény. Ha nincs megadva alapértelmezett érték, a függvény NULL értéket ad vissza. "A megadott eltolásnál nincs esemény" eset lehet 1) ha az eddig látott megfelelő események száma kisebb a megadott eltolásnál, vagy 2) ha a megadott eltolásnál az esemény a megadott limit_duration_clause 3) szerint időtúllépést mutat, de nem egyezik a when_clause megadott logikai feltétellel.
Ha a megadott eltolásnál lévő esemény létezik, és a scalar_expression értéke NULL, akkor NULL
részében talál.” az alapértelmezett érték lehet oszlop, albekérdezés vagy más kifejezés, de nem tartalmazhat más
elemzési függvények vagy külső függvények. alapértelmezettnek pontosan ugyanazzal a típussal kell rendelkeznie, mint
scalar_expression.
OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])
partition_by_clause A PARTITION BY <partíciókulcs-záradék> csak azokat az eseményeket kéri, amelyek értéke
<a partíciókulcs> megegyezik az aktuális figyelembe vett eseményével. Például:
LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))
visszaadja ugyanannak az érzékelőnek az előző olvasatát, mint az aktuális eseményt (ha ez az előző 1 órán belül történt).
limit_duration záradék DURATION(<egység>, <hossz>)
Meghatározza, hogy az aktuális esemény előzményeinek mekkora részét kell figyelembe venni. A támogatott egységek részletes leírását és rövidítéseit a DATEDIFF szakaszban találja. Ha a DURATION intervallumon belül nem található elegendő egyező esemény, a rendszer az <alapértelmezett> értéket adja vissza.
when_clause
Logikai feltételt ad meg a LAG-számításokban figyelembe venni kívánt eseményekhez. Ha a DURATION intervallumon belül nem található elegendő egyező esemény, a rendszer az <alapértelmezett> értéket adja vissza. A when_clause megadása nem kötelező.
Visszatérési típusok
A megadott scalar_expression adattípusa. NULL értéket ad vissza, ha scalar_expression
Általános megjegyzések
A LAG nem determinisztikus. Az események feldolgozása időbeli sorrendben történik. Ha több, azonos időbélyeggel rendelkező esemény is van, a rendszer érkezési sorrendben dolgozza fel az eseményeket.
Ha LAG-t alkalmaz egy ablakos függvény eredményhalmazára, az váratlan eredményeket eredményezhet. Az ablakos függvények megváltoztatják az események időbélyegét, mivel minden ablakművelet eseményt ad ki az ablak végén. Egy esemény aktuális időbélyege a system.timestamp() használatával érhető el, az ablakművelet után az eltér az eredeti eseményidő attribútumtól. Ha a LAG nem helyezhető át az ablakművelet előtt, fontolja meg a CollectTop használatát, és az eredeti eseményidő szerint rendezze a műveletet.
Példák
A növekedés sebességének kiszámítása érzékelőnként:
SELECT sensorId,
growth = reading -
LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))
FROM input
Keresse meg a korábbi not-null érzékelői olvasást:
SELECT
sensorId,
LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading IS NOT NULL)
FROM input
Keresse meg egy adott érzékelőtípus korábbi nem null értékű érzékelőinek olvasását:
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
Határozza meg, hogy egy változó mikor lépi át a küszöbértéket:
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
Lásd még:
ISFIRST (Azure Stream Analytics)
LAST (Azure Stream Analytics)