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 A
och 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.