Sdílet prostřednictvím


Běžné vzory dotazů v Azure Stream Analytics a Fabric Eventstreamu

Poznámka:

Eventstream fabric je založený na stejném modulu runtime jako Azure Stream Analytics. Proto jsou koncepty popsané v tomto článku použitelné jak pro Azure Stream Analytics, tak pro eventstream fabric.

Dotazy ve službě Azure Stream Analytics se vyjadřují v dotazovacím jazyce podobném SQL. Konstruktory jazyka jsou zdokumentované v referenční příručce dotazovacího jazyka Stream Analytics .

Návrh dotazu může vyjádřit jednoduchou průchozí logiku pro přesun dat událostí z jednoho vstupního datového proudu do výstupního úložiště dat nebo může provádět bohaté porovnávání vzorů a dočasnou analýzu k výpočtu agregací v různých časových oknech, jako je sestavení řešení IoT pomocí průvodce Stream Analytics . Můžete spojit data z více vstupů a kombinovat streamované události a můžete provádět vyhledávání se statickými referenčními daty za účelem obohacení hodnot událostí. Data můžete také zapisovat do více výstupů.

Tento článek popisuje řešení několika běžných vzorů dotazů založených na reálných scénářích.

Podporované formáty dat

Azure Stream Analytics podporuje zpracování událostí ve formátech dat CSV, JSON a Avro. Formáty JSON a Avro můžou obsahovat složité typy, jako jsou vnořené objekty (záznamy) nebo pole. Další informace o práci s těmito komplexními datovými typy najdete v tématu Analýza dat JSON a AVRO.

Odeslání dat do několika výstupů

K výstupu dat do různých výstupních jímek je možné použít několik příkazů SELECT . Například jeden příkaz SELECT může generovat výstup upozornění založené na prahové hodnotě, zatímco druhý může generovat výstup událostí do blobového úložiště.

Zvažte následující vstup:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

A chcete z dotazu získat následující dva výstupy:

ArchiveVýstup:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

AlertOutput:

| Make | Time | Count |
| --- | --- | --- |
| Make2 |2023-01-01T00:00:10.0000000Z |3 |

Dotaz se dvěma příkazy SELECT s výstupem archivu a výstupem výstrahy jako výstupy:

SELECT
	*
INTO
	ArchiveOutput
FROM
	Input TIMESTAMP BY Time

SELECT
	Make,
	System.TimeStamp() AS Time,
	COUNT(*) AS [Count]
INTO
	AlertOutput
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)
HAVING
	[Count] >= 3

Klauzule INTO říká službě Stream Analytics, do které z výstupů zapisují data. První select definuje průchozí dotaz, který přijímá data ze vstupu a odesílá je do výstupu s názvem ArchiveOutput. Druhý dotaz agreguje a filtruje data před odesláním výsledků do výstupu podřízeného systému upozornění s názvem AlertOutput.

Klauzuli WITH lze použít k definování více bloků poddotazů. Tato možnost má tu výhodu, že omezuje počet čtenářů, kteří mají přístup ke vstupnímu zdroji.

Dotaz:

WITH ReaderQuery AS (
	SELECT
		*
	FROM
		Input TIMESTAMP BY Time
)

SELECT * INTO ArchiveOutput FROM ReaderQuery

SELECT 
	Make,
	System.TimeStamp() AS Time,
	COUNT(*) AS [Count] 
INTO AlertOutput 
FROM ReaderQuery
GROUP BY
	Make,
	TumblingWindow(second, 10)
HAVING [Count] >= 3

Další informace najdete v klauzuli WITH.

Jednoduchý předávací dotaz

Jednoduchý předávací dotaz lze použít ke zkopírování vstupních dat datového proudu do výstupu. Pokud je třeba například datový proud obsahující informace o vozidle v reálném čase uložit do databáze SQL pro pozdější analýzu, provede to jednoduchý předávací dotaz.

Zvažte následující vstup:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

Chcete, aby byl výstup stejný jako vstup:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

Tady je dotaz:

SELECT
	*
INTO Output
FROM Input

Tento select * dotazuje všechna pole příchozí události a odešle je do výstupu. Místo toho můžete projektovat pouze požadovaná pole v příkazu SELECT . V následujícím příkladu příkaz SELECT projektuje pouze pole Make a Time ze vstupních dat.

Zvažte následující vstup:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |1000 |
| Make1 |2023-01-01T00:00:02.0000000Z |2000 |
| Make2 |2023-01-01T00:00:04.0000000Z |1500 |

Chcete, aby výstup měl jenom pole Make a Čas:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:04.0000000Z |

Tady je dotaz, který zobrazuje pouze požadovaná pole:

SELECT
	Make, Time
INTO Output
FROM Input

Porovnávání řetězců s LIKE a NOT LIKE

Funkce LIKE a NOT LIKE se dají použít k ověření, jestli pole odpovídá určitému vzoru. Filtr můžete například použít k vrácení pouze licenčních plátů, které začínají písmenem A a končí číslem 9.

Zvažte následující vstup:

| Make | License_plate | Time |
| --- | --- | --- |
| Make1 |ABC-123 |2023-01-01T00:00:01.0000000Z |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |

Chcete, aby výstup měl licenční značky, které začínají písmenem A a končí číslem 9:

| Make | License_plate | Time |
| --- | --- | --- |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |

Tady je dotaz, který používá operátor LIKE:

SELECT
	*
FROM
	Input TIMESTAMP BY Time
WHERE
	License_plate LIKE 'A%9'

Pomocí příkazu LIKE zkontrolujte hodnotu pole License_plate . Měl by začínat písmenem A, pak mít libovolný řetězec nula nebo více znaků, končící číslem 9.

Výpočet nad minulými událostmi

Funkci LAG lze použít k zobrazení minulých událostí v časovém intervalu a jejich porovnání s aktuální událostí. Například značka aktuálního auta může být zobrazeno, pokud se liší od značky posledního auta, které projelo mýtnicí.

Ukázkový vstup:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |

Ukázkový výstup:

| Make | Time |
| --- | --- |
| Make2 |2023-01-01T00:00:02.0000000Z |

Ukázkový dotaz:

SELECT
	Make,
	Time
FROM
	Input TIMESTAMP BY Time
WHERE
	LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make

Použijte LAG, abyste se podívali do vstupního datového proudu o jednu událost zpět, načetli hodnotu Make, porovnali ji s hodnotou Make aktuální události a událost odeslali do výstupu.

Další informace naleznete v části LAG.

Vrácení poslední události v okně

Vzhledem k tomu, že systém zpracovává události v reálném čase, neexistuje žádná funkce, která by určila, zda je událost poslední, která přichází v daném časovém okně. Aby toho bylo dosaženo, vstupní datový proud musí být připojen k jinému, kde čas události je maximální doba pro všechny události v tomto okně.

Ukázkový vstup:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| RMV 8282 |Make1 |2023-07-27T00:05:01.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

Ukázkový výstup s informacemi o posledních autech ve dvou desetiminutových časových oknech:

| License_plate | Make | Time |
| --- | --- | --- |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

Ukázkový dotaz:

WITH LastInWindow AS
(
	SELECT 
		MAX(Time) AS LastEventTime
	FROM 
		Input TIMESTAMP BY Time
	GROUP BY 
		TumblingWindow(minute, 10)
)

SELECT 
	Input.License_plate,
	Input.Make,
	Input.Time
FROM
	Input TIMESTAMP BY Time 
	INNER JOIN LastInWindow
	ON DATEDIFF(minute, Input, LastInWindow) BETWEEN 0 AND 10
	AND Input.Time = LastInWindow.LastEventTime

První krok dotazu najde maximální časové razítko v 10-minutových oknech, což znamená časové razítko poslední události pro toto okno. Druhý krok spojí výsledky prvního dotazu s původním streamem a vyhledá událost, která odpovídá posledním časovým razítkům v každém okně.

DATEDIFF je funkce specifická pro datum, která porovnává a vrací časový rozdíl mezi dvěma poli DateTime. Další informace najdete v tématu Funkce data.

Další informace o připojování streamů najdete v tématu JOIN.

Agregace dat v průběhu času

Pokud chcete vypočítat informace v průběhu časového intervalu, můžete data agregovat. V tomto příkladu výraz vypočítá počet za posledních 10 sekund pro každou konkrétní značku auta.

Ukázkový vstup:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |1000 |
| Make1 |2023-01-01T00:00:02.0000000Z |2000 |
| Make2 |2023-01-01T00:00:04.0000000Z |1500 |

Ukázkový výstup:

| Make | Count |
| --- | --- |
| Make1 | 2 |
| Make2 | 1 |

Dotaz:

SELECT
	Make,
	COUNT(*) AS Count
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)

Tato agregace seskupuje vozy podle kategorie Make a počítá je každých 10 sekund. Výstup obsahuje Značku a Počet automobilů, které prošly placenou kabinou.

TumblingWindow je funkce pro vytváření oken, která slouží ke seskupování událostí. Agregaci je možné použít u všech seskupených událostí. Další informace najdete v tématu okenní funkce.

Další informace o agregaci najdete v tématu Agregační funkce.

Pravidelné výstupy hodnot

Pokud události chybí nebo jsou nepravidelné, je možné generovat pravidelný intervalový výstup z řidšího vstupu dat. Vygenerujte například událost každých 5 sekund, která hlásí naposledy zobrazený datový bod.

Ukázkový vstup:

| Time | Value |
| --- | --- |
| "2014-01-01T06:01:00" |1 |
| "2014-01-01T06:01:05" |2 |
| "2014-01-01T06:01:10" |3 |
| "2014-01-01T06:01:15" |4 |
| "2014-01-01T06:01:30" |5 |
| "2014-01-01T06:01:35" |6 |

Ukázkový výstup (prvních 10 řádků):

| Window_end | Last_event.Time | Last_event.Value |
| --- | --- | --- |
| 2014-01-01T14:01:00.000Z |2014-01-01T14:01:00.000Z |1 |
| 2014-01-01T14:01:05.000Z |2014-01-01T14:01:05.000Z |2 |
| 2014-01-01T14:01:10.000Z |2014-01-01T14:01:10.000Z |3 |
| 2014-01-01T14:01:15.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:20.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:25.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:30.000Z |2014-01-01T14:01:30.000Z |5 |
| 2014-01-01T14:01:35.000Z |2014-01-01T14:01:35.000Z |6 |
| 2014-01-01T14:01:40.000Z |2014-01-01T14:01:35.000Z |6 |
| 2014-01-01T14:01:45.000Z |2014-01-01T14:01:35.000Z |6 |

Ukázkový dotaz:

SELECT
	System.Timestamp() AS Window_end,
	TopOne() OVER (ORDER BY Time DESC) AS Last_event
FROM
	Input TIMESTAMP BY Time
GROUP BY
	HOPPINGWINDOW(second, 300, 5)

Tento dotaz generuje události každých 5 sekund a vypíše poslední přijatou událost. Doba trvání HOPPINGWINDOW určuje, jak daleko do minulosti dotaz hledá nejnovější událost.

Další informace najdete v tématu Skákání okna.

Korelace událostí ve streamu

Korelace událostí ve stejném datovém proudu se dá provést zobrazením minulých událostí pomocí funkce LAG . Výstup lze například vygenerovat pokaždé, když dva po sobě jdoucí vozy ze stejné značky projíždějí mýtnou bránou v posledních 90 sekundách.

Ukázkový vstup:

| Make | License_plate | Time |
| --- | --- | --- |
| Make1 |ABC-123 |2023-01-01T00:00:01.0000000Z |
| Make1 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make2 |DEF-987 |2023-01-01T00:00:03.0000000Z |
| Make1 |GHI-345 |2023-01-01T00:00:04.0000000Z |

Ukázkový výstup:

| Make | Time | Current_car_license_plate | First_car_license_plate | First_car_time |
| --- | --- | --- | --- | --- |
| Make1 |2023-01-01T00:00:02.0000000Z |AAA-999 |ABC-123 |2023-01-01T00:00:01.0000000Z |

Ukázkový dotaz:

SELECT
	Make,
	Time,
	License_plate AS Current_car_license_plate,
	LAG(License_plate, 1) OVER (LIMIT DURATION(second, 90)) AS First_car_license_plate,
	LAG(Time, 1) OVER (LIMIT DURATION(second, 90)) AS First_car_time
FROM
	Input TIMESTAMP BY Time
WHERE
	LAG(Make, 1) OVER (LIMIT DURATION(second, 90)) = Make

Funkce LAG se může podívat do vstupního datového proudu o jednu událost zpět a načíst hodnotu Make a porovnat ji s hodnotou Make aktuální události. Jakmile je podmínka splněna, data z předchozí události lze promítat pomocí LAG v příkazu SELECT.

Další informace najdete v tématu LAG.

Zjištění doby trvání mezi událostmi

Dobu trvání události je možné vypočítat tak, že se podíváte na poslední počáteční událost po přijetí události Ukončení. Tento dotaz může být užitečný k určení času stráveného uživatelem na stránce nebo funkci.

Ukázkový vstup:

| User | Feature | Event | Time |
| --- | --- | --- | --- |
| user@location.com |RightMenu |Start |2023-01-01T00:00:01.0000000Z |
| user@location.com |RightMenu |End |2023-01-01T00:00:08.0000000Z |

Ukázkový výstup:

| User | Feature | Duration |
| --- | --- | --- |
| user@location.com |RightMenu |7 |

Ukázkový dotaz:

SELECT
	[user],
	feature,
	DATEDIFF(
		second,
		LAST(Time) OVER (PARTITION BY [user], feature LIMIT DURATION(hour, 1) WHEN Event = 'start'),
		Time) as duration
FROM input TIMESTAMP BY Time
WHERE
	Event = 'end'

Funkci LAST lze použít k načtení poslední události v rámci konkrétní podmínky. V tomto příkladu je podmínka událost typu Start, rozdělení vyhledávání podle PARTITION BY uživatele a funkce. Tímto způsobem je s každým uživatelem a funkcí zacházeno nezávisle při vyhledávání události Start. LIMIT DURATION omezuje hledání zpět v čase na 1 hodinu mezi událostmi End a Start.

Počet jedinečných hodnot

Počet a DISTINCT lze použít ke spočítání počtu jedinečných hodnot polí, které se zobrazují v datovém proudu v časovém intervalu. Během dvousekundového intervalu můžete vytvořit dotaz, který vypočítá, kolik jedinečných značek aut prošlo přes placenou kabinu.

Ukázkový vstup:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

Ukázkový výstup:

| Count_make | Time |
| --- | --- |
| 2 |2023-01-01T00:00:02.000Z |
| 1 |2023-01-01T00:00:04.000Z |

Ukázkový dotaz:

SELECT
     COUNT(DISTINCT Make) AS Count_make,
     System.TIMESTAMP() AS Time
FROM Input TIMESTAMP BY TIME
GROUP BY 
     TumblingWindow(second, 2)

Funkce COUNT(DISTINCT Make) vrátí počet jedinečných hodnot ve sloupci Vytvořit v časovém intervalu. Další informace najdete v tématu Agregační funkce COUNT.

Načtení první události z okna

Pomocí IsFirst můžete načíst první událost v časovém okně. Například výstup informací o prvním autě v každém 10minutovém intervalu.

Ukázkový vstup:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| RMV 8282 |Make1 |2023-07-27T00:05:01.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

Ukázkový výstup:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |

Ukázkový dotaz:

SELECT 
	License_plate,
	Make,
	Time
FROM 
	Input TIMESTAMP BY Time
WHERE 
	IsFirst(minute, 10) = 1

IsFirst může také rozdělit data a vypočítat první událost pro každou konkrétní značku auta Make nalezenou v každém 10minutovém intervalu.

Ukázkový výstup:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

Ukázkový dotaz:

SELECT 
	License_plate,
	Make,
	Time
FROM 
	Input TIMESTAMP BY Time
WHERE 
	IsFirst(minute, 10) OVER (PARTITION BY Make) = 1

Další informace najdete v tématu IsFirst.

Odebrání duplicitních událostí v okně

Při provádění operace, jako je výpočet průměrů nad událostmi v daném časovém intervalu, by se měly filtrovat duplicitní události. V následujícím příkladu je druhá událost duplikát první.

Ukázkový vstup:

| DeviceId | Time | Attribute | Value |
| --- | --- | --- | --- |
| 1 |2018-07-27T00:00:01.0000000Z |Temperature |50 |
| 1 |2018-07-27T00:00:01.0000000Z |Temperature |50 |
| 2 |2018-07-27T00:00:01.0000000Z |Temperature |40 |
| 1 |2018-07-27T00:00:05.0000000Z |Temperature |60 |
| 2 |2018-07-27T00:00:05.0000000Z |Temperature |50 |
| 1 |2018-07-27T00:00:10.0000000Z |Temperature |100 |

Ukázkový výstup:

| AverageValue | DeviceId |
| --- | --- |
| 70 | 1 |
|45 | 2 |

Ukázkový dotaz:

WITH Temp AS (
	SELECT Value, DeviceId
	FROM Input TIMESTAMP BY Time
	GROUP BY Value, DeviceId, System.Timestamp()
)
 

SELECT
	AVG(Value) AS AverageValue, DeviceId
INTO Output
FROM Temp
GROUP BY DeviceId,TumblingWindow(minute, 5)

Při spuštění prvního příkazu jsou duplicitní záznamy sloučeny do jednoho, protože pole v klauzuli GROUP BY jsou všechna stejná. Proto odebere duplikáty.

Určení logiky pro různé případy/hodnoty (příkazy CASE)

Příkazy CASE můžou poskytovat různé výpočty pro různá pole na základě konkrétního kritéria. Například přiřaďte pruh A autům Make1 a pruh B k libovolné jiné značce.

Ukázkový vstup:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

Ukázkový výstup:

| Make |Dispatch_to_lane | Time |
| --- | --- | --- |
| Make1 |"A" |2023-01-01T00:00:01.0000000Z |
| Make2 |"B" |2023-01-01T00:00:02.0000000Z |

Ukázkový dotaz:

SELECT
	Make
	CASE
		WHEN Make = "Make1" THEN "A"
		ELSE "B"
	END AS Dispatch_to_lane,
	System.TimeStamp() AS Time
FROM
	Input TIMESTAMP BY Time

Výraz CASE porovnává výraz se sadou jednoduchých výrazů k určení výsledku. V tomto příkladu jsou vozidla Make1 odesílána do jízdního pruhu A, zatímco vozidla jakéhokoliv jiného provedení budou přiřazena do jízdního pruhu B.

Další informace najdete ve výrazu případu.

Konverze dat

Data lze přetypovat v reálném čase pomocí metody CAST . Hmotnost auta je například možné převést z typu nvarchar(max) na typ bigint a použít se při číselném výpočtu.

Ukázkový vstup:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

Ukázkový výstup:

| Make | Weight |
| --- | --- |
| Make1 |3000 |

Ukázkový dotaz:

SELECT
	Make,
	SUM(CAST(Weight AS BIGINT)) AS Weight
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)

K určení datového typu použijte příkaz CAST . Podívejte se na seznam podporovaných datových typů u datových typů (Azure Stream Analytics).

Další informace o funkcích převodu dat.

Zjištění doby trvání podmínky

Pro podmínky, které procházejí více událostmi, lze funkci LAG použít k identifikaci doby trvání této podmínky. Předpokládejme například, že chyba vedla ke všem autům s nesprávnou hmotností (nad 20 000 liber) a doba trvání této chyby se musí vypočítat.

Ukázkový vstup:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |2000 |
| Make2 |2023-01-01T00:00:02.0000000Z |25000 |
| Make1 |2023-01-01T00:00:03.0000000Z |26000 |
| Make2 |2023-01-01T00:00:04.0000000Z |25000 |
| Make1 |2023-01-01T00:00:05.0000000Z |26000 |
| Make2 |2023-01-01T00:00:06.0000000Z |25000 |
| Make1 |2023-01-01T00:00:07.0000000Z |26000 |
| Make2 |2023-01-01T00:00:08.0000000Z |2000 |

Ukázkový výstup:

| Start_fault | End_fault |
| --- | --- |
| 2023-01-01T00:00:02.000Z |2023-01-01T00:00:07.000Z |

Ukázkový dotaz:

WITH SelectPreviousEvent AS
(
SELECT
	*,
	LAG([time]) OVER (LIMIT DURATION(hour, 24)) as previous_time,
	LAG([weight]) OVER (LIMIT DURATION(hour, 24)) as previous_weight
FROM input TIMESTAMP BY [time]
)

SELECT 
	LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN previous_weight < 20000 ) [Start_fault],
	previous_time [End_fault]
FROM SelectPreviousEvent
WHERE
	[weight] < 20000
	AND previous_weight > 20000

První příkaz SELECT koreluje aktuální měření hmotnosti s předchozím měřením a promítá ho spolu s aktuálním měřením. Druhý SELECT se vrací k poslední události, kde previous_weight je menší než 20000, aktuální váha je menší než 20000 a previous_weight aktuální události byla větší než 20000.

End_fault je aktuální bezchybná událost, kde byla předchozí událost chybná, a Start_fault je poslední bezchybná událost před tím.

Zpracování událostí s nezávislým časem (podstreamy)

Události můžou dorazit pozdě nebo mimo pořadí kvůli nerovnoměrné distribuci hodin mezi producenty událostí, nerovnoměrnou distribuci hodin mezi oddíly nebo latencí sítě. Například hodiny zařízení pro tollID 2 jsou pět sekund za tollID 1 a hodiny zařízení pro tollID 3 jsou 10 sekund za TollID 1. Výpočet může probíhat nezávisle pro každé mýtné, pouze s ohledem na vlastní časová data jako časové razítko.

Ukázkový vstup:

| LicensePlate | Make | Time | TollID |
| --- | --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:01.0000000Z | 1 |
| YHN 6970 |Make2 |2023-07-27T00:00:05.0000000Z | 1 |
| QYF 9358 |Make1 |2023-07-27T00:00:01.0000000Z | 2 |
| GXF 9462 |Make3 |2023-07-27T00:00:04.0000000Z | 2 |
| VFE 1616 |Make2 |2023-07-27T00:00:10.0000000Z | 1 |
| RMV 8282 |Make1 |2023-07-27T00:00:03.0000000Z | 3 |
| MDR 6128 |Make3 |2023-07-27T00:00:11.0000000Z | 2 |
| YZK 5704 |Make4 |2023-07-27T00:00:07.0000000Z | 3 |

Ukázkový výstup:

| TollID | Count |
| --- | --- |
| 1 | 2 |
| 2 | 2 |
| 1 | 1 |
| 3 | 1 |
| 2 | 1 |
| 3 | 1 |

Ukázkový dotaz:

SELECT
      TollId,
      COUNT(*) AS Count
FROM input
      TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId

Klauzule TIMESTAMP OVER BY sleduje každou časovou osu zařízení nezávisle pomocí podstreamů. Výstupní událost pro jednotlivé ID mýtného je vygenerována při výpočtu, což znamená, že události jsou v pořadí vzhledem k jednotlivým ID mýtného, místo aby byly přeuspořádány, jako by všechna zařízení byla synchronizována na stejný čas.

Další informace naleznete v tématu TIMESTAMP BY OVER.

Okna relace

Okno relace je okno, které se neustále rozšiřuje při výskytu událostí a přestane provádět výpočty, pokud se po určité době neobdrží žádná událost nebo pokud okno dosáhne své maximální doby trvání. Toto okno je zvlášť užitečné při výpočtu dat interakce uživatelů. Okno se spustí, když uživatel začne pracovat se systémem a zavře se, když nejsou pozorovány žádné další události, což znamená, že uživatel přestal interagovat. Uživatel například pracuje s webovou stránkou, kde se protokoluje počet kliknutí, pomocí okna relace můžete zjistit, jak dlouho uživatel s webem pracoval.

Ukázkový vstup:

| User_id | Time | URL |
| --- | --- | --- |
| 0 | 2017-01-26T00:00:00.0000000Z | "www.example.com/a.html" |
| 0 | 2017-01-26T00:00:20.0000000Z | "www.example.com/b.html" |
| 1 | 2017-01-26T00:00:55.0000000Z | "www.example.com/c.html" |
| 0 | 2017-01-26T00:01:10.0000000Z | "www.example.com/d.html" |
| 1 | 2017-01-26T00:01:15.0000000Z | "www.example.com/e.html" |

Ukázkový výstup:

| User_id | StartTime | EndTime | Duration_in_seconds |
| --- | --- | --- | --- |
| 0 | 2017-01-26T00:00:00.0000000Z | 2017-01-26T00:01:10.0000000Z | 70 |
| 1 | 2017-01-26T00:00:55.0000000Z | 2017-01-26T00:01:15.0000000Z | 20 |

Ukázkový dotaz:

SELECT
	user_id,
	MIN(time) as StartTime,
	MAX(time) as EndTime,
	DATEDIFF(second, MIN(time), MAX(time)) AS duration_in_seconds
FROM input TIMESTAMP BY time
GROUP BY
	user_id,
	SessionWindow(minute, 1, 60) OVER (PARTITION BY user_id)

Select projektuje data relevantní pro interakci uživatele spolu s dobou trvání interakce. Seskupení dat podle uživatele a SessionWindow, který se zavře, pokud během 1 minuty nedojde k žádné interakci, s maximální délkou trvání 60 minut.

Další informace o OknoRelace naleznete v Okno relace.

Uživatelem definované funkce v JavaScriptu a C#

Poznámka:

Tato část se nevztahuje na Fabric Eventstream.

Dotazovací jazyk Azure Stream Analytics je možné rozšířit o vlastní funkce napsané v jazyce JavaScript nebo C#. Uživatelem definované funkce (UDF) jsou vlastní nebo složité výpočty, které nelze snadno vyjádřit pomocí jazyka SQL . Tyto UDF (uživatelsky definované funkce) lze definovat pouze jednou a použít opakovaně v rámci dotazu. Například UDF lze použít k převodu šestnáctkové hodnoty nvarchar(max) na hodnotu bigint .

Ukázkový vstup:

| Device_id | HexValue |
| --- | --- |
| 1 | "B4" |
| 2 | "11B" |
| 3 | "121" |

Ukázkový výstup:

| Device_id | Decimal |
| --- | --- |
| 1 | 180 |
| 2 | 283 |
| 3 | 289 |
function hex2Int(hexValue){
	return parseInt(hexValue, 16);
}
public static class MyUdfClass {
	public static long Hex2Int(string hexValue){
		return int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
	}
}
SELECT
	Device_id,
	udf.Hex2Int(HexValue) AS Decimal
From
	Input

Uživatelsky definovaná funkce vypočítá hodnotu bigint z HexValue pro každou spotřebovanou událost.

Další informace najdete v tématu JavaScript a C#.

Pokročilé porovnávání vzorů s MATCH_RECOGNIZE

MATCH_RECOGNIZE je pokročilý mechanismus porovnávání vzorů, který lze použít ke sekvenci událostí s dobře definovaným vzorem regulárního výrazu. Atm se například monitoruje v reálném čase kvůli selháním během provozu atm, pokud existují dvě po sobě jdoucí upozornění, musí být správce upozorněn.

Vstup:

| ATM_id | Operation_id | Return_Code | Time |
| --- | --- | --- | --- |
| 1 | "Entering Pin" | "Success" | 2017-01-26T00:10:00.0000000Z |
| 2 | "Opening Money Slot" | "Success" | 2017-01-26T00:10:07.0000000Z |
| 2 | "Closing Money Slot" | "Success" | 2017-01-26T00:10:11.0000000Z |
| 1 | "Entering Withdraw Quantity" | "Success" | 2017-01-26T00:10:08.0000000Z |
| 1 | "Opening Money Slot" | "Warning" | 2017-01-26T00:10:14.0000000Z |
| 1 | "Printing Bank Balance" | "Warning" | 2017-01-26T00:10:19.0000000Z |

Výstup:

| ATM_id | First_Warning_Operation_id | Warning_Time |
| --- | --- | --- |
| 1 | "Opening Money Slot" | 2017-01-26T00:10:14.0000000Z |
SELECT *
FROM input TIMESTAMP BY time OVER ATM_id
MATCH_RECOGNIZE (
	LIMIT DURATION(minute, 1)
	PARTITION BY ATM_id
	MEASURES
		First(Warning.ATM_id) AS ATM_id,
		First(Warning.Operation_Id) AS First_Warning_Operation_id,
		First(Warning.Time) AS Warning_Time
	AFTER MATCH SKIP TO NEXT ROW
	PATTERN (Success+ Warning{2,})
	DEFINE
		Success AS Success.Return_Code = 'Success',
		Warning AS Warning.Return_Code <> 'Success'
) AS patternMatch

Tento dotaz odpovídá alespoň dvěma událostem po sobě jdoucím selháním a při splnění podmínek vygeneruje alarm. PATTERN definuje regulární výraz, který se má použít pro porovnávání, v tomto případě alespoň dvě po sobě jdoucí upozornění po alespoň jedné úspěšné operaci. Úspěch a upozornění se definují pomocí hodnoty Return_Code a jakmile je splněna podmínka. OPATŘENÍ** jsou předpokládány s ATM_id, zahrnují první operační varování a čas prvního varování.

Další informace najdete v tématu MATCH_RECOGNIZE.

Geofencing a geoprostorové dotazy

Azure Stream Analytics poskytuje integrované geoprostorové funkce, které je možné použít k implementaci scénářů, jako je správa vozového parku, sdílení jízdy, propojená auta a sledování prostředků. Geoprostorová data je možné ingestovat buď ve formátech GeoJSON, nebo WKT jako součást eventstreamu nebo referenčních dat. Například společnost, která se specializuje na výrobní stroje pro tisk pasů, zapůjčí své stroje vládám a úřadům. Umístění těchto strojů je silně řízeno, aby se zabránilo chybnému a možnému použití pro padělání pasů. Každý počítač je vybaven GPS trackerem, jejichž informace se předávají zpět do úlohy Azure Stream Analytics. Výrobce by chtěl sledovat polohu těchto strojů a být upozorněn, pokud některý z nich opustí autorizovanou oblast. Tímto způsobem může zařízení vzdáleně deaktivovat, upozornit orgány a získat zařízení zpět.

Vstup:

| Equipment_id | Equipment_current_location | Time |
| --- | --- | --- |
| 1 | "POINT(-122.13288797982818 47.64082002051315)" | 2017-01-26T00:10:00.0000000Z |
| 1 | "POINT(-122.13307252987875 47.64081350934929)" | 2017-01-26T00:11:00.0000000Z |
| 1 | "POINT(-122.13308862313283 47.6406508603241)" | 2017-01-26T00:12:00.0000000Z |
| 1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00.0000000Z |

Vstup referenčních dat:

| Equipment_id | Equipment_lease_location |
| --- | --- |
| 1 | "POLYGON((-122.13326028450979 47.6409833866794,-122.13261655434621 47.6409833866794,-122.13261655434621 47.64061471602751,-122.13326028450979 47.64061471602751,-122.13326028450979 47.6409833866794))" |

Výstup:

| Equipment_id | Equipment_alert_location | Time |
| --- | --- | --- |
| 1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00.0000000Z |
SELECT
	input.Equipment_id AS Equipment_id,
	input.Equipment_current_location AS Equipment_current_location,
	input.Time AS Time
FROM input TIMESTAMP BY time
JOIN
	referenceInput 
	ON input.Equipment_id = referenceInput.Equipment_id
	WHERE 
		ST_WITHIN(input.Equipment_current_location, referenceInput.Equipment_lease_location) = 1

Dotaz umožňuje výrobci automaticky monitorovat umístění počítačů a dostávat výstrahy, když počítač opustí povolenou geografickoufenci. Integrovaná geoprostorová funkce umožňuje uživatelům používat data GPS v rámci dotazu bez knihoven třetích stran.

Další informace najdete v článku o geofencingu a geoprostorové agregaci pomocí Azure Stream Analytics .

Získání pomoci

Pokud potřebujete další pomoc, vyzkoušejte naši stránku pro otázky Microsoftu pro Azure Stream Analytics.

Další kroky