Běžné vzory dotazů ve službě Azure Stream Analytics

Dotazy v 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 výstupem upozornění založeného na prahové hodnotě, zatímco druhý může výstupem událostí do úložiště objektů blob.

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:

ArchivOutput:

| 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á výhodu otevření menšího počtu čtenářů pro vstupní zdroj.

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říkazový projekt SELECT pouze pole Vytvořit a Čas 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 Vytvořit 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ý projektuje 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čí číslem9:

| 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 make of the current car can be outputted if it's different from the last car that passed through the toll booth.

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

Pomocí lag se můžete podívat do vstupního datového proudu o jednu událost zpět, načíst hodnotu Make a porovnat ji s hodnotou Make aktuální události a výstupem události.

Další informace najdete v tématu LAG.

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

Vzhledem k tomu, že systém využívá události v reálném čase, neexistuje žádná funkce, která by určila, jestli je událost poslední, která se má pro dané časové období dorazit. 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 10minutových oknech, tj. č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 vypočítá příkaz počet za posledních 10 sekund času pro každou určitou hodnotu 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 má Make a Count automobilů, které prošly placenou kabinou.

PřeskakujícíWindow je funkce pro vytváření oken, která slouží k seskupení událostí dohromady. Agregaci je možné použít u všech seskupených událostí. Další informace najdete v tématu Funkce pro práci s okny.

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ý výstup intervalu z více zhuštější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 od dotazu 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ého modelu Make procházejí placenou kabinou za posledních 90 sekund.

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 v příkazu SELECT promítnuta pomocí lag.

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 uživatele a funkce PARTITION BY . Tímto způsobem se každý uživatel a funkce při hledání události Start zachází nezávisle. 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. V dvousekundovém okně můžete vytvořit dotaz, který vypočítá, kolik jedinečných závoz 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 v okně

První událost můžete IsFirst načíst v časovém intervalu. 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 na každé konkrétní auto Make found 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 jako pole ve skupině podle klauzule jsou všechny stejné. Proto odebere duplicity.

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 pruhy A autům Make1 a pruhům B k libovolnému jinému provedení.

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 Make1 se vozidla odesílají do jízdního pruhu A , zatímco vozidla jakéhokoli jiného provedení budou přiřazena jízdním pruhem B.

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

Převod 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 vrátí k poslední události, kde je previous_weight menší než 20000, kde aktuální váha je menší než 2 0000 a previous_weight aktuální události byla větší než 2 0000.

End_fault je aktuální nefaultovaná událost, kdy byla předchozí událost chybná a Start_fault je poslední událost, která se předtím neshodovala.

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ždou bezplatnou linku vzhledem k vlastním datům hodin 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é placené ID se vygeneruje při výpočtu, což znamená, že události jsou v pořádku vzhledem k jednotlivým placeným IDENTIFIKÁTORům , a ne aby se přeuspořádaly, jako kdyby byla všechna zařízení ve stejných hodinách.

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

Okna relace

Okno relace je okno, které se neustále rozšiřuje, jak se události vyskytují, a zavře se pro výpočet, pokud se po určité době neobdrží žádná událost nebo pokud okno dosáhne 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 RelaceWindow , které se zavře, pokud nedojde k žádné interakci do 1 minuty, s maximální velikostí okna 60 minut.

Další informace o RelaciWindow naleznete v části Okno relace .

Uživatelem definované funkce v JavaScriptu a C#

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 funkce definované uživatelem je možné definovat jednou a použít vícekrát 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živatelem definovaná funkce vypočítá hodnotu bigint z HexValue při každé spotřebované události.

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 Succes.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 po splnění podmínky se míry promítnou s ATM_id, první operací upozornění a časem prvního upozorně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 datového proudu událostí 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, který se předává zpět do úlohy Azure Stream Analytics. Výroba by chtěla sledovat polohu těchto strojů a být upozorněna, pokud některý z nich opustí autorizovanou oblast, tímto způsobem může vzdáleně zakázat, upozornit orgány a načíst zařízení.

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_currenct_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