Dela via


Vanliga frågemönster i Azure Stream Analytics

Frågor i Azure Stream Analytics formuleras på ett SQL-liknande frågespråk. Språkkonstruktionerna dokumenteras i referensguiden för Stream Analytics-frågespråk.

Frågedesignen kan uttrycka enkel direktlogik för att flytta händelsedata från en indataström till ett utdatalager, eller göra omfattande mönstermatchning och temporal analys för att beräkna aggregeringar över olika tidsfönster som i guiden Skapa en IoT-lösning med hjälp av Stream Analytics . Du kan koppla data från flera indata för att kombinera strömmande händelser, och du kan göra sökningar mot statiska referensdata för att utöka händelsevärdena. Du kan också skriva data till flera utdata.

Den här artikeln beskriver lösningar på flera vanliga frågemönster baserat på verkliga scenarier.

Dataformat som stöds

Azure Stream Analytics stöder bearbetning av händelser i CSV-, JSON- och Avro-dataformat. JSON- och Avro-formaten kan innehålla komplexa typer som kapslade objekt (poster) eller matriser. Mer information om hur du arbetar med dessa komplexa datatyper finns i Parsa JSON- och AVRO-data.

Skicka data till flera utdata

Flera SELECT-instruktioner kan användas för att mata ut data till olika utdatamottagare. En SELECT-instruktion kan till exempel mata ut en tröskelvärdesbaserad avisering medan en annan kan mata ut händelser till en bloblagring.

Överväg följande indata:

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

Och du vill ha följande två utdata från frågan:

ArchiveOutput:

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

Fråga med två SELECT-uttryck med Arkivera utdata och Aviseringsutdata som utdata:

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

INTO-satsen talar om för Stream Analytics-tjänsten vilka av utdata som data ska skrivas till. Den första SELECT definierar en direktfråga som tar emot data från indata och skickar den till utdata med namnet ArchiveOutput. Den andra frågan aggregerar och filtrerar data innan resultatet skickas till ett nedströmsaviseringssystem med namnet AlertOutput.

WITH-satsen kan användas för att definiera flera underfrågor. Det här alternativet har fördelen att färre läsare öppnas i indatakällan.

Fråga:

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

Mer information finns i WITH-satsen.

Enkel direktfråga

En enkel direktfråga kan användas för att kopiera indataströmdata till utdata. Om till exempel en dataström som innehåller fordonsinformation i realtid måste sparas i en SQL-databas för senare analys, utför en enkel direktfråga jobbet.

Överväg följande indata:

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

Du vill att utdata ska vara samma som indata:

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

Här är frågan:

SELECT
	*
INTO Output
FROM Input

Den här SELECT * frågan projicerar alla fält i en inkommande händelse och skickar dem till utdata. I stället kan du bara projicera de obligatoriska fälten i en SELECT-instruktion . I följande exempel projicerar SELECT-instruktionen endast fälten Make and Time från indata.

Överväg följande indata:

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

Du vill att utdata bara ska ha fälten Make and Time:

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

Här är frågan som endast projicerar de obligatoriska fälten:

SELECT
	Make, Time
INTO Output
FROM Input

Strängmatchning med LIKE och NOT LIKE

LIKE och NOT LIKE kan användas för att kontrollera om ett fält matchar ett visst mönster. Du kan till exempel använda ett filter för att endast returnera de registreringsskyltar som börjar med bokstaven A och slutar med talet 9.

Överväg följande indata:

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

Du vill att utdata ska ha de registreringsskyltar som börjar med bokstaven A och slutar med numret 9:

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

Här är en fråga som använder LIKE-operatorn:

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

Använd LIKE-instruktionen för att kontrollera värdet för fältet License_plate. Den bör börja med bokstaven Aoch sedan ha en sträng med noll eller fler tecken, som slutar med talet 9.

Beräkning över tidigare händelser

FUNKTIONEN LAG kan användas för att titta på tidigare händelser inom ett tidsfönster och jämföra dem med den aktuella händelsen. Till exempel kan den aktuella bilens märke matas ut om den skiljer sig från den sista bilen som passerade genom vägtullsbåset.

Exempelindata:

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

Exempelutdata:

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

Exempelfråga:

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

Använd LAG för att titta in i indataströmmen en händelse tillbaka, hämta värdet Make och jämföra det med make-värdet för den aktuella händelsen och mata ut händelsen.

Mer information finns i LAG.

Returnera den sista händelsen i ett fönster

Eftersom händelser förbrukas av systemet i realtid finns det ingen funktion som kan avgöra om en händelse är den sista som anländer för den tidsperioden. För att uppnå detta måste indataströmmen kopplas till en annan där tiden för en händelse är den maximala tiden för alla händelser i det fönstret.

Exempelindata:

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

Exempel på utdata med information om de senaste bilarna i två tiominutersperioder:

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

Exempelfråga:

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

Det första steget i frågan hittar den maximala tidsstämpeln i 10-minutersfönster, dvs. tidsstämpeln för den sista händelsen för det fönstret. Det andra steget kopplar resultatet av den första frågan till den ursprungliga dataströmmen för att hitta händelsen som matchar de senaste tidsstämplarna i varje fönster.

DATEDIFF är en datumspecifik funktion som jämför och returnerar tidsskillnaden mellan två DateTime-fält. Mer information finns i datumfunktioner.

Mer information om hur du ansluter strömmar finns i JOIN.

Datasammansättning över tid

Om du vill beräkna information över ett tidsfönster kan du aggregera data. I det här exemplet beräknar -instruktionen ett antal under de senaste 10 sekunderna av tiden för varje specifik bils märke.

Exempelindata:

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

Exempelutdata:

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

Fråga:

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

Den här aggregeringen grupperar bilarna efter Make och räknar dem var 10:e sekund. Utdata har Make and Count av bilar som gick igenom avgiftsbelagd monter.

TumblingWindow är en fönsterfunktion som används för att gruppera händelser tillsammans. En aggregering kan tillämpas på alla grupperade händelser. Mer information finns i fönsterfunktioner.

Mer information om aggregering finns i aggregerade funktioner.

Utdatavärden med jämna mellanrum

När händelser saknas eller är oregelbundna kan ett regelbundet intervallutdata genereras från en mer gles datainmatning. Generera till exempel en händelse var femte sekund som rapporterar den senast sedda datapunkten.

Exempelindata:

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

Exempelutdata (de första 10 raderna):

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

Exempelfråga:

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)

Den här frågan genererar händelser var 5:e sekund och matar ut den senaste händelsen som togs emot tidigare. HOPPINGWINDOW-varaktigheten avgör hur långt tillbaka frågan ser ut för att hitta den senaste händelsen.

Mer information finns i Hopping-fönstret.

Korrelera händelser i en ström

Korrelering av händelser i samma ström kan göras genom att titta på tidigare händelser med hjälp av FUNKTIONEN LAG . Till exempel kan utdata genereras varje gång två bilar i följd från samma Make går igenom avgiftsbelagd monter under de senaste 90 sekunderna.

Exempelindata:

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

Exempelutdata:

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

Exempelfråga:

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

FUNKTIONEN LAG kan titta på indataströmmen en händelse tillbaka och hämta värdet Make (Gör) och jämföra det med make-värdet för den aktuella händelsen. När villkoret är uppfyllt kan data från föregående händelse projiceras med hjälp av LAG i SELECT-instruktionen.

Mer information finns i LAG.

Identifiera varaktigheten mellan händelser

Varaktigheten för en händelse kan beräknas genom att titta på den senaste starthändelsen när en end-händelse har tagits emot. Den här frågan kan vara användbar för att avgöra hur lång tid en användare lägger på en sida eller en funktion.

Exempelindata:

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

Exempelutdata:

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

Exempelfråga:

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'

Funktionen LAST kan användas för att hämta den sista händelsen inom ett visst villkor. I det här exemplet är villkoret en händelse av typen Start som partitionerar sökningen efter PARTITION BY-användare och funktion. På så sätt behandlas alla användare och funktioner oberoende av varandra när de söker efter Start-händelsen. LIMIT DURATION begränsar sökningen tillbaka i tiden till 1 timme mellan händelserna End och Start.

Räkna unika värden

COUNT och DISTINCT kan användas för att räkna antalet unika fältvärden som visas i dataströmmen inom ett tidsfönster. Du kan skapa en fråga för att beräkna hur många unika bilskapare som har passerat genom avgiftsbelagd monter i ett 2-sekundersfönster.

Exempelindata:

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

Exempelutdata :

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

Exempelfråga :

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

COUNT(DISTINCT Make) returnerar antalet distinkta värden i kolumnen Gör inom ett tidsfönster. Mer information finns i mängdfunktionen COUNT.

Hämta den första händelsen i ett fönster

Du kan använda IsFirst för att hämta den första händelsen i ett tidsfönster. Du kan till exempel mata ut den första bilinformationen var 10:e minut.

Exempelindata:

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

Exempelutdata:

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

Exempelfråga:

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

IsFirst kan också partitionera data och beräkna den första händelsen till varje specifik bil Make hittades var 10:e minuts intervall.

Exempelutdata:

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

Exempelfråga:

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

Mer information finns i IsFirst.

Ta bort dubbletthändelser i ett fönster

När du utför en åtgärd, till exempel att beräkna medelvärden över händelser under en viss tidsperiod, bör dubbletthändelser filtreras. I följande exempel är den andra händelsen en dubblett av den första.

Exempelindata:

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

Exempelutdata:

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

Exempelfråga:

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)

När den första instruktionen körs kombineras de duplicerade posterna till ett eftersom fälten i gruppen efter-satsen är likadana. Därför tar den bort dubbletter.

Ange logik för olika fall/värden (CASE-instruktioner)

CASE-instruktioner kan ge olika beräkningar för olika fält, baserat på ett visst kriterium. Till exempel tilldela körfält A till bilar av Make1 och körfält B till alla andra märke.

Exempelindata:

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

Exempelutdata:

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

Exempelfråga:

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

CASE-uttrycket jämför ett uttryck med en uppsättning enkla uttryck för att fastställa resultatet. I det här exemplet skickas fordon av Make1 till körfält A medan fordon av andra märke kommer att tilldelas körfält B.

Mer information finns i ärendeuttryck.

Datakonvertering

Data kan castas i realtid med hjälp av CAST-metoden . Bilvikt kan till exempel konverteras från typ nvarchar(max) till att skriva bigint och användas i en numerisk beräkning.

Exempelindata:

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

Exempelutdata:

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

Exempelfråga:

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

Använd en CAST-instruktion för att ange dess datatyp. Se listan över datatyper som stöds för datatyper (Azure Stream Analytics).

Mer information om datakonverteringsfunktioner.

Identifiera varaktigheten för ett villkor

För villkor som sträcker sig över flera händelser kan FUNKTIONEN LAG användas för att identifiera varaktigheten för villkoret. Anta till exempel att en bugg resulterade i att alla bilar hade en felaktig vikt (över 20 000 pund) och att buggens varaktighet måste beräknas.

Exempelindata:

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

Exempelutdata:

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

Exempelfråga:

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

Den första SELECT-instruktionen korrelerar den aktuella viktmätningen med föregående mätning och projicerar den tillsammans med den aktuella mätningen. Den andra SELECT ser tillbaka på den senaste händelsen där previous_weight är mindre än 20000, där den aktuella vikten är mindre än 20000 och den aktuella händelsens previous_weight var större än 20000.

Den End_fault är den aktuella icke-felhändelsen där föregående händelse var felaktig, och Start_fault är den sista icke-felhändelsen innan det.

Bearbeta händelser med oberoende tid (underströmmar)

Händelser kan komma sent eller ur ordning på grund av klocksnedvridningar mellan händelseproducenter, klocksnedvridningar mellan partitioner eller nätverksfördröjning. Enhetsklockan för TollID 2 är till exempel fem sekunder efter TollID 1 och enhetsklockan för TollID 3 är 10 sekunder efter TollID 1. En beräkning kan ske separat för varje vägtull, med endast sina egna klockdata som en tidsstämpel.

Exempelindata:

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

Exempelutdata:

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

Exempelfråga:

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

TIMESTAMP OVER BY-satsen tittar på varje enhets tidslinje oberoende av varandra med hjälp av underströmmar. Utdatahändelsen för varje TollID genereras när de beräknas, vilket innebär att händelserna är i ordning med avseende på varje TollID i stället för att sorteras om som om alla enheter var på samma klocka.

Mer information finns i TIMESTAMP BY OVER.

Sessionsfönster

Ett sessionsfönster är ett fönster som fortsätter att expandera när händelser inträffar och stängs för beräkning om ingen händelse tas emot efter en viss tid eller om fönstret når sin maximala varaktighet. Det här fönstret är särskilt användbart när du beräknar användarinteraktionsdata. Ett fönster startar när en användare börjar interagera med systemet och stängs när inga fler händelser observeras, vilket innebär att användaren har slutat interagera. En användare interagerar till exempel med en webbsida där antalet klick loggas. Ett sessionsfönster kan användas för att ta reda på hur länge användaren interagerade med webbplatsen.

Exempelindata:

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

Exempelutdata:

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

Exempelfråga:

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 projicerar data som är relevanta för användarinteraktionen, tillsammans med interaktionens varaktighet. Gruppera data efter användare och en SessionWindow som stängs om ingen interaktion sker inom 1 minut, med en maximal fönsterstorlek på 60 minuter.

Mer information om SessionWindow finns i Sessionsfönster .

Användardefinierade funktioner i JavaScript och C#

Azure Stream Analytics-frågespråket kan utökas med anpassade funktioner skrivna antingen på JavaScript- eller C#-språk. Användardefinierade funktioner (UDF) är anpassade/komplexa beräkningar som inte enkelt kan uttryckas med sql-språket. Dessa UDF:er kan definieras en gång och användas flera gånger i en fråga. En UDF kan till exempel användas för att konvertera ett hexadecimalt nvarchar(max) -värde till ett bigint-värde .

Exempelindata:

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

Exempelutdata:

| 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

Den användardefinierade funktionen beräknar bigint-värdet från HexValue för varje händelse som används.

Mer information finns i JavaScript och C#.

Avancerad mönstermatchning med MATCH_RECOGNIZE

MATCH_RECOGNIZE är en avancerad mönstermatchningsmekanism som kan användas för att matcha en sekvens av händelser med ett väldefinierat mönster för reguljära uttryck. En atm övervakas till exempel i realtid för fel, under atm-driften om det finns två på varandra följande varningsmeddelanden som administratören behöver meddelas.

Indata:

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

Utdata:

| 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

Den här frågan matchar minst två på varandra följande felhändelser och genererar ett larm när villkoren uppfylls. PATTERN definierar det reguljära uttryck som ska användas på matchningen, i det här fallet minst två varningar i följd efter minst en lyckad åtgärd. Lyckades och Varning definieras med hjälp av Return_Code värde och när villkoret är uppfyllt beräknas MÅTTen med ATM_id, den första varningsåtgärden och första varningstiden.

Mer information finns i MATCH_RECOGNIZE.

Geofencing- och geospatiala frågor

Azure Stream Analytics tillhandahåller inbyggda geospatiala funktioner som kan användas för att implementera scenarier som hantering av flottan, samåkning, anslutna bilar och tillgångsspårning. Geospatiala data kan matas in i geoJSON- eller WKT-format som en del av händelseströmmen eller referensdata. Till exempel ett företag som är specialiserat på tillverkning av maskiner för att skriva ut pass, hyr sina maskiner till regeringar och konsulat. Placeringen av dessa maskiner är starkt kontrollerad för att undvika felplacing och eventuell användning för förfalskning av pass. Varje dator är utrustad med en GPS-tracker, den informationen vidarebefordras tillbaka till ett Azure Stream Analytics-jobb. Tillverkningen vill hålla reda på platsen för dessa datorer och bli varnad om någon av dem lämnar ett godkänt område, på det här sättet kan de fjärraktivera, varna myndigheter och hämta utrustningen.

Indata:

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

Referensdataindata:

| 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))" |

Utdata:

| 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

Frågan gör det möjligt för tillverkaren att övervaka datorns plats automatiskt och få aviseringar när en dator lämnar den tillåtna geofencen. Med den inbyggda geospatiala funktionen kan användare använda GPS-data i frågan utan bibliotek från tredje part.

Mer information finns i artikeln Geofencing och geospatial aggregering med Azure Stream Analytics .

Få hjälp

Om du vill ha mer hjälp kan du prova vår frågesida för Microsoft Q&A för Azure Stream Analytics.

Nästa steg