Allgemeine Abfragemuster in Azure Stream AnalyticsCommon query patterns in Azure Stream Analytics

Abfragen in Azure Stream Analytics werden in einer SQL-ähnlichen Abfragesprache ausgedrückt.Queries in Azure Stream Analytics are expressed in a SQL-like query language. Diese Sprachkonstrukte sind im Handbuch Referenz zur Stream Analytics-Abfragesprache dokumentiert.The language constructs are documented in the Stream Analytics query language reference guide.

Der Abfrageentwurf kann einfache Pass-Through-Logik zum Verschieben von Ereignisdaten aus einem Eingabestream in einen Ausgabedatenspeicher ausdrücken oder umfangreiche Musterabgleiche und temporale Analysen durchführen, um Aggregate in verschiedenen Zeitfenstern zu berechnen. Dieser Vorgang wird im Leitfaden Erstellen einer IoT-Lösung mithilfe von Stream Analytics erläutert.The query design can express simple pass-through logic to move event data from one input stream into an output data store, or it can do rich pattern matching and temporal analysis to calculate aggregates over various time windows as in the Build an IoT solution by using Stream Analytics guide. Sie können Daten aus mehreren Eingaben verknüpfen, um Streamingereignisse zu kombinieren. Zudem können Sie Suchvorgänge für statische Verweisdaten ausführen, um die Ereigniswerte zu ergänzen.You can join data from multiple inputs to combine streaming events, and you can do lookups against static reference data to enrich the event values. Sie können auch Daten in mehrere Ausgaben schreiben.You can also write data to multiple outputs.

Dieser Artikel zeigt anhand von Praxisbeispielen Lösungen für mehrere weit verbreitete Abfragemuster.This article outlines solutions to several common query patterns based on real-world scenarios.

Unterstützte DatenformateSupported Data Formats

Azure Stream Analytics unterstützt die Verarbeitung von Ereignissen in den Datenformaten CSV, JSON und Avro.Azure Stream Analytics supports processing events in CSV, JSON and Avro data formats.

Sowohl JSON als auch Avro können komplexe Typen enthalten, z.B. geschachtelte Objekte (Datensätze) oder Arrays.Both JSON and Avro may contain complex types such as nested objects (records) or arrays. Weitere Informationen zum Umgang mit diesen komplexen Datentypen finden Sie im Artikel zum Thema Analysieren von JSON- und AVRO-Daten in Azure Stream Analytics.For more information on working with these complex data types, refer to the Parsing JSON and AVRO data article.

Senden von Daten an mehrere AusgabenSend data to multiple outputs

Für die Ausgabe von Daten an unterschiedliche Ausgabesenken können mehrere SELECT-Anweisungen verwendet werden.Multiple SELECT statements can be used to output data to different output sinks. Beispielsweise kann eine SELECT-Anweisung eine auf dem Schwellenwert basierende Warnung ausgeben, eine andere kann hingegen Ereignis in einen Blobspeicher ausgeben.For example, one SELECT can output a threshold-based alert while another one can output events to blob storage.

Eingabe:Input:

MakeMake TimeTime
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make1Make1 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make2Make2 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make2Make2 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make2Make2 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

ArchiveOutput-Ausgabe:Output ArchiveOutput:

MakeMake TimeTime
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make1Make1 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make2Make2 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make2Make2 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make2Make2 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

AlertOutput-Ausgabe:Output AlertOutput:

MakeMake TimeTime AnzahlCount
Make2Make2 2015-01-01T00:00:10.0000000Z2015-01-01T00:00:10.0000000Z 33

Query (Abfrage):Query:

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

Mit der INTO-Klausel wird Stream Analytics mitgeteilt, in welche Ausgabe die Daten geschrieben werden sollen.The INTO clause tells Stream Analytics which of the outputs to write the data to. Die erste SELECT-Anweisung definiert eine Pass-Through-Abfrage, die Daten aus der Eingabe empfängt und sie an die Ausgabe mit dem Namen ArchiveOutput sendet.The first SELECT defines a pass-through query that receives data from the input and sends it to the output named ArchiveOutput. Die zweite Abfrage führt eine einfache Aggregation und Filterung durch, bevor die Ergebnisse an ein nachgeschaltetes Warnsystem namens AlertOutput gesendet wird.The second query does some simple aggregation and filtering before sending the results to a downstream alerting system output called AlertOutput.

Beachten Sie, dass mit der WITH-Klausel mehrere Unterabfrageblöcke definiert werden können.Note that the WITH clause can be used to define multiple sub-query blocks. Diese Option hat den Vorteil, dass weniger Leser für die Eingabequelle geöffnet werden müssen.This option has the benefit of opening fewer readers to the input source.

Query (Abfrage):Query:

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

Weitere Informationen finden Sie unter WITH-Klausel.For more information, refer to WITH clause.

Einfache Pass-Through-AbfrageSimple pass-through query

Eine einfache Pass-Through-Abfrage kann verwendet werden, um die Daten des Eingabestreams in die Ausgabe zu kopieren.A simple pass-through query can be used to copy the input stream data into the output. Wenn z. B. ein Stream mit Echtzeit-Fahrzeuginformationen für eine Buchstabenanalyse in einer SQL-Datenbank gespeichert werden muss, führt eine einfache Pass-Through-Abfrage den Auftrag aus.For example, if a stream of data containing real-time vehicle information needs to be saved in a SQL database for letter analysis, a simple pass-through query will do the job.

Eingabe:Input:

MakeMake TimeTime WeightWeight
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z "1000""1000"
Make1Make1 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z "2000""2000"

Ausgabe:Output:

MakeMake TimeTime WeightWeight
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z "1000""1000"
Make1Make1 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z "2000""2000"

Query (Abfrage):Query:

SELECT
    *
INTO Output
FROM Input

Eine SELECT *-Abfrage projiziert alle Felder eines eingehenden Ereignisses und sendet sie an die Ausgabe.A SELECT * query projects all the fields of an incoming event and sends them to the output. Mit SELECT- können Sie auf dieselbe Weise nur erforderliche Felder aus der Eingabe projizieren.The same way, SELECT can also be used to only project required fields from the input. Wenn wie in diesem Beispiel nur die Felder Make und Time eines Fahrzeugs die einzigen erforderlichen Felder sind, die gespeichert werden müssen, können diese Felder in der SELECT-Anweisung angegeben werden.In this example, if vehicle Make and Time are the only required fields to be saved, those fields can be specified in the SELECT statement.

Eingabe:Input:

MakeMake TimeTime WeightWeight
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z 10001000
Make1Make1 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z 20002000
Make2Make2 2015-01-01T00:00:04.0000000Z2015-01-01T00:00:04.0000000Z 15001500

Ausgabe:Output:

MakeMake TimeTime
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make1Make1 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make2Make2 2015-01-01T00:00:04.0000000Z2015-01-01T00:00:04.0000000Z

Query (Abfrage):Query:

SELECT
    Make, Time
INTO Output
FROM Input

Zeichenfolgenabgleich mit LIKE und NOT LIKEString matching with LIKE and NOT LIKE

Mit LIKE und NOT LIKE kann verifiziert werden, ob ein Feld mit einem bestimmten Muster übereinstimmt.LIKE and NOT LIKE can be used to verify if a field matches a certain pattern. Beispielsweise kann ein Filter erstellt werden, um nur die Nummernschilder zurückzugeben, die mit dem Buchstaben „A“ beginnen und mit der Zahl 9 enden.For example, a filter can be created to return only the license plates that start with the letter 'A' and end with the number 9.

Eingabe:Input:

MakeMake License_plateLicense_plate TimeTime
Make1Make1 ABC-123ABC-123 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make2Make2 AAA-999AAA-999 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make3Make3 ABC-369ABC-369 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

Ausgabe:Output:

MakeMake License_plateLicense_plate TimeTime
Make2Make2 AAA-999AAA-999 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make3Make3 ABC-369ABC-369 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

Query (Abfrage):Query:

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

Verwenden Sie die LIKE-Anweisung, um den Feldwert von License_plate zu überprüfen.Use the LIKE statement to check the License_plate field value. Dieser sollte mit „A“ beginnen, gefolgt von einer leeren Zeichenfolge oder einer Zeichenfolge mit einer beliebigen Anzahl von Zeichen und mit „9“ enden.It should start with the letter 'A', then have any string of zero or more characters, ending with the number 9.

Berechnung für vergangene EreignisseCalculation over past events

Mit der LAG-Funktion können vergangene Ereignisse innerhalb eines Zeitfensters betrachtet und mit dem aktuellen Ereignis verglichen werden.The LAG function can be used to look at past events within a time window and compare them against the current event. Beispielsweise kann die aktuelle Fahrzeugmarke ausgegeben werden, wenn sie sich von der des letzten Fahrzeugs unterscheidet, das die Mautstation passiert hat.For example, the current car make can be outputted if it is different from the last car that went through the toll.

Eingabe:Input:

MakeMake TimeTime
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make2Make2 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z

Ausgabe:Output:

MakeMake TimeTime
Make2Make2 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z

Query (Abfrage):Query:

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

Mit LAG können Sie einen Blick in den Eingabestream des vorherigen Ereignisses werfen, den Wert Make abrufen, ihn mit dem Wert Make des aktuellen Ereignisses vergleichen und das Ereignis ausgeben.Use LAG to peek into the input stream one event back, retrieving the Make value and comparing it to the Make value of the current event and output the event.

Weitere Informationen finden Sie unter LAG.For more information, refer to LAG.

Zurückgeben des letzten Ereignisses in einem ZeitfensterReturn the last event in a window

Da Ereignisse vom System in Echtzeit verarbeitet werden, gibt es keine Funktion, die feststellen kann, ob ein Ereignis für dieses Zeitfenster als letztes eintrifft.As events are consumed by the system in real-time, there is no function that can determine if an event will be the last one to arrive for that window of time. Dazu muss der Eingabestream mit einem anderen Stream verbunden werden, bei dem der Zeitpunkt eines Ereignisses die maximale Zeit für alle Ereignisse in diesem Fenster ist.To achieve this, the input stream needs to be joined with another where the time of an event is the maximum time for all events at that window.

Eingabe:Input:

License_plateLicense_plate MakeMake TimeTime
DXE 5291DXE 5291 Make1Make1 2015-07-27T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z
YZK 5704YZK 5704 Make3Make3 2015-07-27T00:02:17.0000000Z2015-07-27T00:02:17.0000000Z
RMV 8282RMV 8282 Make1Make1 2015-07-27T00:05:01.0000000Z2015-07-27T00:05:01.0000000Z
YHN 6970YHN 6970 Make2Make2 2015-07-27T00:06:00.0000000Z2015-07-27T00:06:00.0000000Z
VFE 1616VFE 1616 Make2Make2 2015-07-27T00:09:31.0000000Z2015-07-27T00:09:31.0000000Z
QYF 9358QYF 9358 Make1Make1 2015-07-27T00:12:02.0000000Z2015-07-27T00:12:02.0000000Z
MDR 6128MDR 6128 Make4Make4 2015-07-27T00:13:45.0000000Z2015-07-27T00:13:45.0000000Z

Ausgabe:Output:

License_plateLicense_plate MakeMake TimeTime
VFE 1616VFE 1616 Make2Make2 2015-07-27T00:09:31.0000000Z2015-07-27T00:09:31.0000000Z
MDR 6128MDR 6128 Make4Make4 2015-07-27T00:13:45.0000000Z2015-07-27T00:13:45.0000000Z

Query (Abfrage):Query:

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

Der erste Schritt in der Abfrage sucht den maximalen Zeitstempel in 10-Minuten-Fenstern, d. h. den Zeitstempel des letzten Ereignisses für dieses Fenster.The first step on the query finds the maximum time stamp in 10-minute windows, that is the time stamp of the last event for that window. Im zweiten Schritt werden die Ergebnisse der ersten Abfrage mit dem ursprünglichen Stream zusammengeführt, um nach dem Ereignis zu suchen, das dem letzten Zeitstempel des jeweiligen Zeitfensters entspricht.The second step joins the results of the first query with the original stream to find the event that match the last time stamps in each window.

DATEDIFF ist eine datumsspezifische Funktion, die den Zeitunterschied zwischen zwei DateTime-Feldern vergleicht und zurückgibt. Weitere Informationen finden Sie unter date-Funktionen.DATEDIFF is a date-specific function that compares and returns the time difference between two DateTime fields, for more information, refer to date functions.

Weitere Informationen zum Verknüpfen von Streams finden Sie unter JOIN.For more information on joining streams, refer to JOIN.

Datenaggregation im ZeitverlaufData aggregation over time

Um Informationen über ein Zeitfenster zu berechnen, können Daten zusammen aggregiert werden.To compute information over a time window, data can be aggregated together. In diesem Beispiel wird für jede spezifische Fahrzeugmarke die Anzahl während der letzten 10 Sekunden berechnet.In this example, a count is computed over the last 10 seconds of time for every specific car make.

Eingabe:Input:

MakeMake TimeTime WeightWeight
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z 10001000
Make1Make1 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z 20002000
Make2Make2 2015-01-01T00:00:04.0000000Z2015-01-01T00:00:04.0000000Z 15001500

Ausgabe:Output:

MakeMake AnzahlCount
Make1Make1 22
Make2Make2 11

Query (Abfrage):Query:

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

Diese Aggregation gruppiert die Fahrzeuge nach dem Wert für Make und zählt sie alle 10 Sekunden.This aggregation groups the cars by Make and counts them every 10 seconds. Die Ausgabe enthält die Werte für Make und Count für die Fahrzeuge, die die Mautstation passiert haben.The output has the Make and Count of cars that went through the toll.

TumblingWindow ist eine Fensterfunktion zum Gruppieren von Ereignissen.TumblingWindow is a windowing function used to group events together. Eine Aggregation kann auf alle gruppierten Ereignisse angewendet werden.An aggregation can be applied over all grouped events. Weitere Informationen finden Sie unter Fensterfunktionen.For more information, see windowing functions.

Weitere Informationen zur Aggregation finden Sie unter Aggregatfunktionen.For more information on aggregation, refer to aggregate functions.

Regelmäßige AusgabewertePeriodically output values

Im Falle von unregelmäßigen oder fehlenden Ereignissen kann aus einer Eingabe mit wenigen Daten eine regelmäßige Intervallausgabe generiert werden.In case of irregular or missing events, a regular interval output can be generated from a more sparse data input. Generieren Sie z.B. alle 5 Sekunden ein Ereignis, das den zuletzt angezeigten Datenpunkt meldet.For example, generate an event every 5 seconds that reports the most recently seen data point.

Eingabe:Input:

TimeTime WertValue
"2014-01-01T06:01:00""2014-01-01T06:01:00" 11
"2014-01-01T06:01:05""2014-01-01T06:01:05" 22
"2014-01-01T06:01:10""2014-01-01T06:01:10" 33
"2014-01-01T06:01:15""2014-01-01T06:01:15" 44
"2014-01-01T06:01:30""2014-01-01T06:01:30" 55
"2014-01-01T06:01:35""2014-01-01T06:01:35" 66

Ausgabe (erste zehn Zeilen) :Output (first 10 rows):

Window_endWindow_end Last_event.TimeLast_event.Time Last_event.ValueLast_event.Value
2014-01-01T14:01:00.000Z2014-01-01T14:01:00.000Z 2014-01-01T14:01:00.000Z2014-01-01T14:01:00.000Z 11
2014-01-01T14:01:05.000Z2014-01-01T14:01:05.000Z 2014-01-01T14:01:05.000Z2014-01-01T14:01:05.000Z 22
2014-01-01T14:01:10.000Z2014-01-01T14:01:10.000Z 2014-01-01T14:01:10.000Z2014-01-01T14:01:10.000Z 33
2014-01-01T14:01:15.000Z2014-01-01T14:01:15.000Z 2014-01-01T14:01:15.000Z2014-01-01T14:01:15.000Z 44
2014-01-01T14:01:20.000Z2014-01-01T14:01:20.000Z 2014-01-01T14:01:15.000Z2014-01-01T14:01:15.000Z 44
2014-01-01T14:01:25.000Z2014-01-01T14:01:25.000Z 2014-01-01T14:01:15.000Z2014-01-01T14:01:15.000Z 44
2014-01-01T14:01:30.000Z2014-01-01T14:01:30.000Z 2014-01-01T14:01:30.000Z2014-01-01T14:01:30.000Z 55
2014-01-01T14:01:35.000Z2014-01-01T14:01:35.000Z 2014-01-01T14:01:35.000Z2014-01-01T14:01:35.000Z 66
2014-01-01T14:01:40.000Z2014-01-01T14:01:40.000Z 2014-01-01T14:01:35.000Z2014-01-01T14:01:35.000Z 66
2014-01-01T14:01:45.000Z2014-01-01T14:01:45.000Z 2014-01-01T14:01:35.000Z2014-01-01T14:01:35.000Z 66

Query (Abfrage):Query:

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)

Diese Abfrage generiert alle fünf Sekunden Ereignisse und gibt das letzte zuvor empfangene Ereignis aus.This query generates events every 5 seconds and outputs the last event that was received previously. Die Dauer eines HOPPINGWINDOW legt fest, wie weit die Abfrage zurückreicht, um das letzte Ereignis zu suchen.The HOPPINGWINDOW duration determines how far back the query looks to find the latest event.

Weitere Informationen finden Sie unter Springendes Fenster.For more information, refer to Hopping window.

Korrelieren von Ereignissen in einem StreamCorrelate events in a stream

Das Korrelieren von Ereignissen im gleichen Stream kann durch die Betrachtung vergangener Ereignisse mithilfe der LAG-Funktion erfolgen.Correlating events in the same stream can be done by looking at past events using the LAG function. So kann z. B. jedes Mal eine Ausgabe generiert werden, wenn zwei Fahrzeuge derselben Marke in den letzten 90 Sekunden nacheinander die Mautstation passiert haben.For example, an output can be generated every time two consecutive cars from the same Make go through the toll for the last 90 seconds.

Eingabe:Input:

MakeMake License_plateLicense_plate TimeTime
Make1Make1 ABC-123ABC-123 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make1Make1 AAA-999AAA-999 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make2Make2 DEF-987DEF-987 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z
Make1Make1 GHI-345GHI-345 2015-01-01T00:00:04.0000000Z2015-01-01T00:00:04.0000000Z

Ausgabe:Output:

MakeMake TimeTime Current_car_license_plateCurrent_car_license_plate First_car_license_plateFirst_car_license_plate First_car_timeFirst_car_time
Make1Make1 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z AAA-999AAA-999 ABC-123ABC-123 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z

Query (Abfrage):Query:

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

Die LAG-Funktion kann in den Eingabestream des vorherigen Ereignisses schauen und den Make-Wert abrufen, um diesen mit dem Make-Wert des aktuellen Ereignisses zu vergleichen.The LAG function can look into the input stream one event back and retrieve the Make value, comparing that with the Make value of the current event. Sobald die Bedingung erfüllt ist, können die Daten aus dem vorherigen Ereignis mithilfe von LAG in die SELECT-Anweisung projiziert werden.Once the condition is met, data from the previous event can be projected using LAG in the SELECT statement.

Weitere Informationen finden Sie unter LAG.For more information, refer to LAG.

Ermitteln der Dauer zwischen EreignissenDetect the duration between events

Die Dauer eines Ereignisses kann berechnet werden, indem das letzte Startereignis betrachtet wird, sobald ein Endereignis empfangen wurde.The duration of an event can be computed by looking at the last Start event once an End event is received. Diese Abfrage kann nützlich sein, um die Zeit zu ermitteln, die ein Benutzer auf einer Seite oder mit einer Funktion verbringt.This query can be useful to determine the time a user spends on a page or a feature.

Eingabe:Input:

BenutzerUser FunktionFeature EreignisEvent TimeTime
user@location.com RightMenuRightMenu StartStart 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
user@location.com RightMenuRightMenu EndeEnd 2015-01-01T00:00:08.0000000Z2015-01-01T00:00:08.0000000Z

Ausgabe:Output:

BenutzerUser FunktionFeature DurationDuration
user@location.com RightMenuRightMenu 77

Query (Abfrage):Query:

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'

Die LAST-Funktion kann verwendet werden, um das letzte Ereignis innerhalb einer bestimmten Bedingung abzurufen.The LAST function can be used to retrieve the last event within a specific condition. In diesem Beispiel ist die Bedingung ein Ereignis vom Typ „Start“, das die Suche nach PARTITION BY-Benutzer und -Funktion partitioniert.In this example, the condition is an event of type Start, partitioning the search by PARTITION BY user and feature. Auf diese Weise werden alle Benutzer und Funktionen bei der Suche nach dem Startereignis unabhängig voneinander behandelt.This way, every user and feature is treated independently when searching for the Start event. LIMIT DURATION begrenzt die zeitliche Rückwärtssuche auf 1 Stunde zwischen dem End- und dem Startereignis.LIMIT DURATION limits the search back in time to 1 hour between the End and Start events.

Zählen eindeutiger WerteCount unique values

COUNT und DISTINCT zählen die Anzahl eindeutiger Feldwerte, die im Stream innerhalb eines bestimmten Zeitraums vorkommen.COUNT and DISTINCT can be used to count the number of unique field values that appear in the stream within a time window. Es kann eine Abfrage erstellt werden, um zu berechnen, wie viele individuelle Fahrzeugmarken in einem Zeitraum von zwei Sekunden die Mautstation passieren.A query can be created to calculate how many unique Makes of cars passed through the toll booth in a 2-second window.

Eingabe:Input:

MakeMake TimeTime
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make1Make1 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make2Make2 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make2Make2 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make2Make2 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

Ausgabe:Output:

Count_makeCount_make TimeTime
22 2015-01-01T00:00:02.000Z2015-01-01T00:00:02.000Z
11 2015-01-01T00:00:04.000Z2015-01-01T00:00:04.000Z

Abfrage:Query:

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

COUNT (DISTINCT Make) gibt die Anzahl der unterschiedlichen Werte der Spalte Make innerhalb eines Zeitfensters zurück.COUNT(DISTINCT Make) returns the count of distinct values in the Make column within a time window. Weitere Informationen finden Sie unter COUNT-Aggregatfunktion.For more information, refer to COUNT aggregate function.

Abrufen des ersten Ereignisses in einem ZeitfensterRetrieve the first event in a window

IsFirst kann verwendet werden, um das erste Ereignis in einem Zeitfenster abzurufen.IsFirst can be used to retrieve the first event in a time window. Beispiel: Ausgabe der ersten Fahrzeuginformationen alle 10 Minuten.For example, outputting the first car information at every 10-minute interval.

Eingabe:Input:

License_plateLicense_plate MakeMake TimeTime
DXE 5291DXE 5291 Make1Make1 2015-07-27T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z
YZK 5704YZK 5704 Make3Make3 2015-07-27T00:02:17.0000000Z2015-07-27T00:02:17.0000000Z
RMV 8282RMV 8282 Make1Make1 2015-07-27T00:05:01.0000000Z2015-07-27T00:05:01.0000000Z
YHN 6970YHN 6970 Make2Make2 2015-07-27T00:06:00.0000000Z2015-07-27T00:06:00.0000000Z
VFE 1616VFE 1616 Make2Make2 2015-07-27T00:09:31.0000000Z2015-07-27T00:09:31.0000000Z
QYF 9358QYF 9358 Make1Make1 2015-07-27T00:12:02.0000000Z2015-07-27T00:12:02.0000000Z
MDR 6128MDR 6128 Make4Make4 2015-07-27T00:13:45.0000000Z2015-07-27T00:13:45.0000000Z

Ausgabe:Output:

License_plateLicense_plate MakeMake TimeTime
DXE 5291DXE 5291 Make1Make1 2015-07-27T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z
QYF 9358QYF 9358 Make1Make1 2015-07-27T00:12:02.0000000Z2015-07-27T00:12:02.0000000Z

Query (Abfrage):Query:

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

IsFirst kann die Daten auch partitionieren und das erste Ereignis für jede spezifische Fahrzeugmarke berechnen, die in jedem 10-Minuten-Intervall gefunden wird.IsFirst can also partition the data and calculate the first event to each specific car Make found at every 10-minute interval.

Ausgabe:Output:

License_plateLicense_plate MakeMake TimeTime
DXE 5291DXE 5291 Make1Make1 2015-07-27T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z
YZK 5704YZK 5704 Make3Make3 2015-07-27T00:02:17.0000000Z2015-07-27T00:02:17.0000000Z
YHN 6970YHN 6970 Make2Make2 2015-07-27T00:06:00.0000000Z2015-07-27T00:06:00.0000000Z
QYF 9358QYF 9358 Make1Make1 2015-07-27T00:12:02.0000000Z2015-07-27T00:12:02.0000000Z
MDR 6128MDR 6128 Make4Make4 2015-07-27T00:13:45.0000000Z2015-07-27T00:13:45.0000000Z

Query (Abfrage):Query:

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

Weitere Informationen finden Sie unter IsFirst.For more information, refer to IsFirst.

Entfernen duplizierter Ereignisse in einem FensterRemove duplicate events in a window

Wenn Sie einen Vorgang ausführen, wie z. B. die Berechnung von Durchschnittswerten für Ereignisse in einem bestimmten Zeitfenster, müssen duplizierte Ereignisse herausgefiltert werden.When performing an operation such as calculating averages over events in a given time window, duplicate events should be filtered. Im folgenden Beispiel ist das zweite Ereignis ein Duplikat des ersten.In the following example, the second event is a duplicate of the first.

Eingabe:Input:

deviceIdDeviceId TimeTime attributeAttribute WertValue
11 2018-07-27T00:00:01.0000000Z2018-07-27T00:00:01.0000000Z TemperaturTemperature 5050
11 2018-07-27T00:00:01.0000000Z2018-07-27T00:00:01.0000000Z TemperaturTemperature 5050
22 2018-07-27T00:00:01.0000000Z2018-07-27T00:00:01.0000000Z TemperaturTemperature 4040
11 2018-07-27T00:00:05.0000000Z2018-07-27T00:00:05.0000000Z TemperaturTemperature 6060
22 2018-07-27T00:00:05.0000000Z2018-07-27T00:00:05.0000000Z TemperaturTemperature 5050
11 2018-07-27T00:00:10.0000000Z2018-07-27T00:00:10.0000000Z TemperaturTemperature 100100

Ausgabe:Output:

AverageValueAverageValue deviceIdDeviceId
7070 11
4545 22

Query (Abfrage):Query:

With Temp AS (
SELECT
    COUNT(DISTINCT Time) AS CountTime,
    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)

COUNT (DISTINCT Time) gibt die Anzahl der unterschiedlichen Werte der Spalte „Time“ innerhalb eines Zeitfensters zurück.COUNT(DISTINCT Time) returns the number of distinct values in the Time column within a time window. Die Ausgabe des ersten Schritts kann dann verwendet werden, um den Durchschnitt pro Gerät zu berechnen, indem Sie Duplikate entfernen.The output of the first step can then be used to compute the average per device, by discarding duplicates.

Weitere Informationen finden Sie unter COUNT (DISTINCT Time).For more information, refer to COUNT(DISTINCT Time).

Logik für verschiedene Fälle/Werte (CASE-Anweisungen)Specify logic for different cases/values (CASE statements)

CASE-Anweisungen können basierend auf einem bestimmten Kriterium verschiedene Berechnungen für verschiedene Felder durchführen.CASE statements can provide different computations for different fields, based on particular criterion. Weisen Sie beispielsweise Fahrzeuge von Make1 Spur „A“ zu und jegliche anderen Marken Spur „B“.For example, assign lane 'A' to cars of Make1 and lane 'B' to any other make.

Eingabe:Input:

MakeMake TimeTime
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make2Make2 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
Make2Make2 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

Ausgabe:Output:

MakeMake Dispatch_to_laneDispatch_to_lane TimeTime
Make1Make1 „A“"A" 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
Make2Make2 „B“"B" 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z

Lösung:Solution:

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

Der CASE-Ausdruck vergleicht einen Ausdruck mit einem Set von einfachen Ausdrücken, um das Ergebnis zu ermitteln.The CASE expression compares an expression to a set of simple expressions to determine its result. In diesem Beispiel werden Fahrzeuge von Make1 an Spur „A“ weitergeleitet, Fahrzeuge einer anderen beliebigen anderen Marke werden Spur „B“ zugewiesen.In this example, vehicles of Make1 are dispatched to lane 'A' while vehicles of any other make will be assigned lane 'B'.

Weitere Informationen finden Sie unter CASE-Ausdruck.For more information, refer to case expression.

DatenkonvertierungData conversion

Daten können mithilfe der CAST-Methode in Echtzeit umgewandelt werden.Data can be cast in real-time using the CAST method. Beispielsweise kann das Fahrzeuggewicht vom Typ nvarchar(max) in den Typ bigint umgewandelt und in einer numerischen Berechnung verwendet werden.For example, car weight can be converted from type nvarchar(max) to type bigint and be used on a numeric calculation.

Eingabe:Input:

MakeMake TimeTime WeightWeight
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z "1000""1000"
Make1Make1 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z "2000""2000"

Ausgabe:Output:

MakeMake WeightWeight
Make1Make1 30003000

Query (Abfrage):Query:

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

Verwenden Sie eine CAST-Anweisung, um den jeweiligen Datentyp anzugeben.Use a CAST statement to specify its data type. Die Liste der unterstützten Datentypen finden Sie unter Datentypen (Azure Stream Analytics).See the list of supported data types on Data types (Azure Stream Analytics).

Weitere Informationen finden Sie unter Funktionen für die Datenkonvertierung.For more information on data conversion functions.

Ermitteln der Dauer einer BedingungDetect the duration of a condition

Für Bedingungen, die mehrere Ereignisse umfassen, kann mit der LAG-Funktion die Dauer der Bedingung bestimmt werden.For conditions that span through multiple events the LAG function can be used to identify the duration of that condition. Beispiel: Aufgrund eines Fehlers wurde für alle Fahrzeuge ein falsches Gewicht (über 20.000 Pfund) erfasst. Nun soll ermittelt werden, wie lange dieser Fehler aufgetreten ist.For example, suppose that a bug resulted in all cars having an incorrect weight (above 20,000 pounds), and the duration of that bug must be computed.

Eingabe:Input:

MakeMake TimeTime WeightWeight
Make1Make1 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z 20002000
Make2Make2 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z 2500025000
Make1Make1 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z 2600026000
Make2Make2 2015-01-01T00:00:04.0000000Z2015-01-01T00:00:04.0000000Z 2500025000
Make1Make1 2015-01-01T00:00:05.0000000Z2015-01-01T00:00:05.0000000Z 2600026000
Make2Make2 2015-01-01T00:00:06.0000000Z2015-01-01T00:00:06.0000000Z 2500025000
Make1Make1 2015-01-01T00:00:07.0000000Z2015-01-01T00:00:07.0000000Z 2600026000
Make2Make2 2015-01-01T00:00:08.0000000Z2015-01-01T00:00:08.0000000Z 20002000

Ausgabe:Output:

Start_faultStart_fault End_faultEnd_fault
2015-01-01T00:00:02.000Z2015-01-01T00:00:02.000Z 2015-01-01T00:00:07.000Z2015-01-01T00:00:07.000Z

Query (Abfrage):Query:

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

Der erste SELECT-Anweisung korreliert die aktuelle Gewichtungsmessung mit der vorherigen Messung und projiziert sie zusammen mit der aktuellen Messung.The first SELECT statement correlates the current weight measurement with the previous measurement, projecting it together with the current measurement. Die zweite SELECT-Anweisung geht zum letzten Ereignis zurück, bei dem der Wert für previous_weight kleiner als 20.000 ist, das aktuelle Gewicht kleiner als 20.000 ist und der Wert für previous_weight des aktuellen Ereignisses größer als 20.000 war.The second SELECT looks back to the last event where the previous_weight is less than 20000, where the current weight is smaller than 20000 and the previous_weight of the current event was bigger than 20000.

„End_fault“ ist das aktuelle nicht fehlerhafte Ereignis, bei dem das vorherige Ereignis fehlerhaft war, und „Start_fault“ ist das letzte nicht fehlerhafte Ereignis vor diesem Ereignis.The End_fault is the current non-faulty event where the previous event was faulty, and the Start_fault is the last non-faulty event before that.

Verarbeiten von Ereignissen mit unabhängiger Zeit (Teilstreams)Process events with independent time (Substreams)

Eintreffen von Ereignissen mit Verzögerung oder in falscher Reihenfolge aufgrund von Uhrabweichungen zwischen Ereignisproduzenten oder Partitionen bzw. Netzwerklatenz.Events can arrive late or out of order due to clock skews between event producers, clock skews between partitions, or network latency. Im folgenden Beispiel liegt die Geräteuhr für TollID 2 fünf Sekunden hinter TollID 1 und die Geräteuhr für TollID 3 zehn Sekunden hinter TollID 1.For example, the device clock for TollID 2 is five seconds behind TollID 1, and the device clock for TollID 3 is ten seconds behind TollID 1. Eine Berechnung kann unabhängig für jede Mautstation erfolgen, wobei nur die eigenen Uhrendaten als Zeitstempel berücksichtigt werden.A computation can happen independently for each toll, considering only its own clock data as a timestamp.

Eingabe:Input:

LicensePlateLicensePlate MakeMake TimeTime TollIdTollID
DXE 5291DXE 5291 Make1Make1 2015-07-27T00:00:01.0000000Z2015-07-27T00:00:01.0000000Z 11
YHN 6970YHN 6970 Make2Make2 2015-07-27T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z 11
QYF 9358QYF 9358 Make1Make1 2015-07-27T00:00:01.0000000Z2015-07-27T00:00:01.0000000Z 22
GXF 9462GXF 9462 Make3Make3 2015-07-27T00:00:04.0000000Z2015-07-27T00:00:04.0000000Z 22
VFE 1616VFE 1616 Make2Make2 2015-07-27T00:00:10.0000000Z2015-07-27T00:00:10.0000000Z 11
RMV 8282RMV 8282 Make1Make1 2015-07-27T00:00:03.0000000Z2015-07-27T00:00:03.0000000Z 33
MDR 6128MDR 6128 Make3Make3 2015-07-27T00:00:11.0000000Z2015-07-27T00:00:11.0000000Z 22
YZK 5704YZK 5704 Make4Make4 2015-07-27T00:00:07.0000000Z2015-07-27T00:00:07.0000000Z 33

Ausgabe:Output:

TollIdTollID AnzahlCount
11 22
22 22
11 11
33 11
22 11
33 11

Query (Abfrage):Query:

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

Die TIMESTAMP BY OVER-Klausel betrachtet die Zeitachse jedes Geräts unabhängig voneinander mit Teilstreams.The TIMESTAMP OVER BY clause looks at each device timeline independently using substreams. Die Ausgabeereignisse für jede TollID werden beim Berechnen generiert. Das bedeutet, dass die Ereignisse gemäß der jeweiligen TollID sortiert werden. Sie werden nicht neu angeordnet, als würden alle Geräte dieselbe Uhrzeit anzeigen.The output event for each TollID is generated as they are computed, meaning that the events are in order with respect to each TollID instead of being reordered as if all devices were on the same clock.

Weitere Informationen finden Sie unter TIMESTAMP BY OVER.For more information, refer to TIMESTAMP BY OVER.

SitzungsfensterSession Windows

Ein Sitzungsfenster ist ein Fenster, das beim Auftreten von Ereignissen immer größer wird und sich für die Berechnung schließt, wenn nach einer bestimmten Zeitspanne kein Ereignis empfangen wird oder wenn das Fenster seine maximale Dauer erreicht.A Session Window is a window that keeps expanding as events occur and closes for computation if no event is received after a specific amount of time or if the window reaches its maximum duration. Dieses Fenster ist besonders nützlich, wenn Benutzerinteraktionsdaten berechnet werden.This window is particularly useful when computing user interaction data. Ein Fenster beginnt, wenn ein Benutzer mit dem System zu interagieren beginnt, und schließt sich, wenn keine weiteren Ereignisse mehr registriert werden, d. h. wenn der Benutzer die Interaktion beendet hat.A window starts when a user starts interacting with the system and closes when no more events are observed, meaning, the user has stopped interacting. Wenn ein Benutzer beispielsweise mit einer Webseite interagiert, auf der die Anzahl der Klicks protokolliert wird, kann mithilfe eines Sitzungsfensters bestimmt werden, wie lange der Benutzer mit der Website interagiert hat.For example, a user is interacting with a web page where the number of clicks is logged, a Session Window can be used to find out how long the user interacted with the site.

Eingabe:Input:

User_idUser_id TimeTime URLURL
00 2017-01-26T00:00:00.0000000Z2017-01-26T00:00:00.0000000Z "www.example.com/a.html""www.example.com/a.html"
00 2017-01-26T00:00:20.0000000Z2017-01-26T00:00:20.0000000Z "www.example.com/b.html""www.example.com/b.html"
11 2017-01-26T00:00:55.0000000Z2017-01-26T00:00:55.0000000Z "www.example.com/c.html""www.example.com/c.html"
00 2017-01-26T00:01:10.0000000Z2017-01-26T00:01:10.0000000Z "www.example.com/d.html""www.example.com/d.html"
11 2017-01-26T00:01:15.0000000Z2017-01-26T00:01:15.0000000Z "www.example.com/e.html""www.example.com/e.html"

Ausgabe:Output:

User_idUser_id StartTimeStartTime EndTimeEndTime Duration_in_secondsDuration_in_seconds
00 2017-01-26T00:00:00.0000000Z2017-01-26T00:00:00.0000000Z 2017-01-26T00:01:10.0000000Z2017-01-26T00:01:10.0000000Z 7070
11 2017-01-26T00:00:55.0000000Z2017-01-26T00:00:55.0000000Z 2017-01-26T00:01:15.0000000Z2017-01-26T00:01:15.0000000Z 2020

Query (Abfrage):Query:

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)

Die SELECT-Anweisung projiziert die für die Benutzerinteraktion relevanten Daten zusammen mit der Dauer der Interaktion.The SELECT projects the data relevant to the user interaction, together with the duration of the interaction. Die Daten werden nach Benutzer und nach einem SessionWindow gruppiert, das sich schließt, wenn innerhalb von 1 Minute keine Interaktion stattfindet. Die maximale Fenstergröße beträgt 60 Minuten.Grouping the data by user and a SessionWindow that closes if no interaction happens within 1 minute, with a maximum window size of 60 minutes.

Weitere Informationen zu SessionWindow finden Sie unter Sitzungsfenster.For more information on SessionWindow, refer to Session Window .

Spracherweiterbarkeit mit benutzerdefinierten Funktionen in JavaScript und C#Language extensibility with User Defined Function in JavaScript and C#

Die Azure Stream Analytics-Abfragesprache kann mithilfe von benutzerdefinierten Funktionen erweitert werden, die in JavaScript oder C# geschrieben werden.Azure Stream Analytics query language can be extended with custom functions written either in JavaScript or C# language. Benutzerdefinierte Funktionen (User Defined Functions, UDF) sind benutzerdefinierte/komplexe Berechnungen, die nicht ohne weiteres mithilfe der SQL-Sprache ausgedrückt werden können.User Defined Functions (UDF) are custom/complex computations that cannot be easily expressed using the SQL language. Diese UDFs können einmalig definiert und mehrmals innerhalb einer Abfrage verwendet werden.These UDFs can be defined once and used multiple times within a query. Eine UDF kann beispielsweise zum Konvertieren eines hexadezimalen Werts nvarchar (max) in einen Wert bigint verwendet werden.For example, an UDF can be used to convert a hexadecimal nvarchar(max) value to an bigint value.

Eingabe:Input:

Device_idDevice_id HexValueHexValue
11 "B4""B4"
22 "11B""11B"
33 "121""121"

Ausgabe:Output:

Device_idDevice_id DecimalDecimal
11 180180
22 283283
33 289289
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

Die benutzerdefinierte Funktion berechnet den Wert bigint aus dem HexValue für jedes verarbeitete Ereignis.The User Defined Function will compute the bigint value from the HexValue on every event consumed.

Weitere Informationen finden Sie unter JavaScript und C#.For more information, refer to JavaScript and C#.

Erweiterter Musterabgleich mit MATCH_RECOGNIZEAdvanced pattern matching with MATCH_RECOGNIZE

MATCH_RECOGNIZE ist ein erweiterter Mechanismus zum Musterabgleich, mit dem eine Sequenz von Ereignissen mit einem klar definierten Muster an regulären Ausdrücken abgeglichen werden kann.MATCH_RECOGNIZE is an advanced pattern matching mechanism that can be used to match a sequence of events to a well-defined regular expression pattern. Beispielsweise wird ein Geldautomat in Echtzeit auf Ausfälle überwacht. Wenn während des Betriebs des Geldautomaten zwei aufeinander folgende Warnmeldungen auftreten, muss der Administrator benachrichtigt werden.For example, an ATM is being monitored at real time for failures, during the operation of the ATM if there are two consecutive warning messages the administrator needs to be notified.

Eingabe:Input:

ATM_idATM_id Operation_idOperation_id Return_CodeReturn_Code TimeTime
11 "Entering Pin""Entering Pin" „Success“"Success" 2017-01-26T00:10:00.0000000Z2017-01-26T00:10:00.0000000Z
22 "Opening Money Slot""Opening Money Slot" „Success“"Success" 2017-01-26T00:10:07.0000000Z2017-01-26T00:10:07.0000000Z
22 "Closing Money Slot""Closing Money Slot" „Success“"Success" 2017-01-26T00:10:11.0000000Z2017-01-26T00:10:11.0000000Z
11 "Entering Withdraw Quantity""Entering Withdraw Quantity" „Success“"Success" 2017-01-26T00:10:08.0000000Z2017-01-26T00:10:08.0000000Z
11 "Opening Money Slot""Opening Money Slot" "Warning""Warning" 2017-01-26T00:10:14.0000000Z2017-01-26T00:10:14.0000000Z
11 "Printing Bank Balance""Printing Bank Balance" "Warning""Warning" 2017-01-26T00:10:19.0000000Z2017-01-26T00:10:19.0000000Z

Ausgabe:Output:

ATM_idATM_id First_Warning_Operation_idFirst_Warning_Operation_id Warning_TimeWarning_Time
11 "Opening Money Slot""Opening Money Slot" 2017-01-26T00:10:14.0000000Z2017-01-26T00:10:14.0000000Z
SELECT *
FROM intput TIMESTAMP BY time OVER ATM_id
MATCH_RECOGNIZE (
    PARTITON BY ATM_id
    LIMIT DURATION(minute, 1)
    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',
        Failure AS Warning.Return_Code <> 'Success'
) AS patternMatch

Diese Abfrage gleicht mindestens zwei aufeinander folgende Fehlerereignisse ab und generiert einen Alarm, wenn die Bedingungen erfüllt sind.This query matches at least two consecutive failure events and generate an alarm when the conditions are met. PATTERN definiert den regulären Ausdruck, der für den Abgleich verwendet werden soll. In diesem Fall ist das eine beliebige Anzahl von erfolgreichen Vorgängen, gefolgt von mindestens zwei aufeinanderfolgenden Fehlern.PATTERN defines the regular expression to be used on the matching, in this case, any number of successful operations followed by at least two consecutive failures. Erfolg und Fehler werden mit dem Wert „Return_Code“ definiert. Sobald die Bedingung erfüllt ist, wird der Wert für MEASURES mit ATM_id, der erste Warnvorgang und der Zeitpunkt der ersten Warnung, projiziert.Success and Failure are defined using Return_Code value and once the condition is met, the MEASURES are projected with ATM_id, the first warning operation and first warning time.

Weitere Informationen finden Sie unter MATCH_RECOGNIZE.For more information, refer to MATCH_RECOGNIZE.

Geofencing und räumliche AbfragenGeofencing and geospatial queries

Im Lieferumfang von Azure Stream Analytics sind räumliche Funktionen enthalten, die verwendet werden können, um Anwendungen für Szenarios wie Flottenmanagement, Fahrgemeinschaften, vernetzte Autos und Asset Tracking zu implementieren.Azure Stream Analytics provides built-in geospatial functions that can be used to implement scenarios such as fleet management, ride sharing, connected cars, and asset tracking. Räumliche Daten können entweder im Format GeoJSON oder im Format WKT als Teil von Ereignisdatenströmen oder Referenzdaten erfasst werden.Geospatial data can be ingested in either GeoJSON or WKT formats as part of event stream or reference data. Ein Unternehmen, das beispielsweise auf die Herstellung von Maschinen für den Druck von Pässen spezialisiert ist, vermietet diese an Behörden und Konsulate.For example, a company that is specialized in manufacturing machines for printing passports, lease their machines to governments and consulates. Der Standort dieser Maschinen wird streng kontrolliert, um die Verlagerung und den möglichen Einsatz zur Fälschung von Pässen zu vermeiden.The location of those machines is heavily controlled as to avoid the misplacing and possible use for counterfeiting of passports. Jedes Gerät ist mit einem GPS-Tracker ausgestattet, der diese Informationen an einen Azure Stream Analytics-Auftrag weiterleitet.Each machine is fitted with a GPS tracker, that information is relayed back to an Azure Stream Analytics job. Der Hersteller möchte den Standort dieser Maschinen im Auge behalten und benachrichtigt werden, wenn eine davon einen autorisierten Bereich verlässt. So kann er die Maschine ferngesteuert abschalten, die Behörden alarmieren und die Ausrüstung zurückholen.The manufacture would like to keep track of the location of those machines and be alerted if one of them leaves an authorized area, this way they can remotely disable, alert authorities and retrieve the equipment.

Eingabe:Input:

Equipment_idEquipment_id Equipment_current_locationEquipment_current_location TimeTime
11 "POINT(-122.13288797982818 47.64082002051315)""POINT(-122.13288797982818 47.64082002051315)" 2017-01-26T00:10:00.0000000Z2017-01-26T00:10:00.0000000Z
11 "POINT(-122.13307252987875 47.64081350934929)""POINT(-122.13307252987875 47.64081350934929)" 2017-01-26T00:11:00.0000000Z2017-01-26T00:11:00.0000000Z
11 "POINT(-122.13308862313283 47.6406508603241)""POINT(-122.13308862313283 47.6406508603241)" 2017-01-26T00:12:00.0000000Z2017-01-26T00:12:00.0000000Z
11 "POINT(-122.13341048821462 47.64043760861279)""POINT(-122.13341048821462 47.64043760861279)" 2017-01-26T00:13:00.0000000Z2017-01-26T00:13:00.0000000Z

Verweisdateneingabe:Reference Data Input:

Equipment_idEquipment_id Equipment_lease_locationEquipment_lease_location
11 "POLYGON((-122.13326028450979 47.6409833866794,-122.13261655434621 47.6409833866794,-122.13261655434621 47.64061471602751,-122.13326028450979 47.64061471602751,-122.13326028450979 47.6409833866794))""POLYGON((-122.13326028450979 47.6409833866794,-122.13261655434621 47.6409833866794,-122.13261655434621 47.64061471602751,-122.13326028450979 47.64061471602751,-122.13326028450979 47.6409833866794))"

Ausgabe:Output:

Equipment_idEquipment_id Equipment_alert_locationEquipment_alert_location TimeTime
11 "POINT(-122.13341048821462 47.64043760861279)""POINT(-122.13341048821462 47.64043760861279)" 2017-01-26T00:13:00.0000000Z2017-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

Mit der Abfrage kann der Hersteller den Standort der Maschinen automatisch überwachen und erhält Warnmeldungen, wenn eine Maschine den zulässigen Geofence verlässt.The query enables the manufacturer to monitor the machines location automatically, getting alerts when a machine leaves the allowed geofence. Dank der integrierten räumlichen Funktion können Benutzer GPS-Daten innerhalb der Abfrage ohne Bibliotheken von Drittanbietern verwenden.The built-in geospatial function allows users to use GPS data within the query without third-party libraries.

Weitere Informationen finden Sie im Artikel Geofencing and geospatial aggregation scenarios with Azure Stream Analytics (Szenarios mit Geofencing und räumlicher Aggregation mit Azure Stream Analytics).For more information, refer to the Geofencing and geospatial aggregation scenarios with Azure Stream Analytics article.

Hier erhalten Sie HilfeGet help

Weitere Unterstützung finden Sie auf der Frageseite von Microsoft Q&A (Fragen und Antworten) zu Azure Stream Analytics.For further assistance, try our Microsoft Q&A question page for Azure Stream Analytics.

Nächste SchritteNext steps