Exemples de requête pour les modes d’utilisation courants dans Stream AnalyticsQuery examples for common Stream Analytics usage patterns

Les requêtes dans Azure Stream Analytics sont exprimées dans un langage de requête de type SQL.Queries in Azure Stream Analytics are expressed in a SQL-like query language. Les constructions de langage sont documentées dans le guide Stream Analytics query language reference (Informations de référence sur le langage de requête Stream Analytics).The language constructs are documented in the Stream Analytics query language reference guide.

La conception de requête peut exprimer la logique de pass-through simple pour déplacer des données d’événement à partir d’un flux d’entrée dans un magasin de données de sortie, ou il peut effectuer des analyse de correspondance et temporelles du modèle riche afin de calculer des agrégats sur différentes fenêtres de temps en tant que dans le créer un IoT solution à l’aide de Stream Analytique guide.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. Vous pouvez joindre des données provenant de plusieurs entrées pour combiner des événements de diffusion en continu, et vous pouvez faire des recherches sur les données de référence statiques pour enrichir les valeurs d’événement.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. Vous pouvez également écrire des données vers plusieurs sorties.You can also write data to multiple outputs.

Cet article décrit les solutions à plusieurs modèles de requête courants basés sur des scénarios réels.This article outlines solutions to several common query patterns based on real-world scenarios.

Utiliser des types de données complexes dans JavaScript Object Notation et AVROWork with complex Data Types in JSON and AVRO

Azure Stream Analytics prend en charge le traitement des événements dans les formats de données CSV, JSON et Avro.Azure Stream Analytics supports processing events in CSV, JSON and Avro data formats.

JSON et Avro peuvent contenir des types complexes, comme des objets imbriqués (enregistrements) ou des tableaux.Both JSON and Avro may contain complex types such as nested objects (records) or arrays. Pour plus d’informations sur l’utilisation de ces types de données complexes, reportez-vous à la les données de l’analyse de JSON et AVRO article.For more information on working with these complex data types, refer to the Parsing JSON and AVRO data article.

Exemple de requête : Convertir les types de donnéesQuery example: Convert data types

Description : Définissez les types de propriétés sur le flux d’entrée.Description: Define the types of properties on the input stream. Par exemple, le poids de la voiture arrive sur le flux d’entrée sous forme de chaînes et doit être converti en INT effectuer somme.For example, the car weight is coming on the input stream as strings and needs to be converted to INT to perform SUM.

Entrée:Input:

MarqueMake TimeTime PoidsWeight
HondaHonda 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z "1000""1000"
HondaHonda 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z "2000""2000"

Sortie:Output:

MarqueMake PoidsWeight
HondaHonda 30003000

Solution:Solution:

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

Explication : Utilisez une instruction CAST dans le champ Poids pour spécifier son type de données.Explanation: Use a CAST statement in the Weight field to specify its data type. Voir la liste des types de données pris en charge dans Data types (Azure Stream Analytics) (Types de données (Azure Stream Analytics)).See the list of supported data types in Data types (Azure Stream Analytics).

Exemple de requête : Utilisez LIKE/NOT, comme pour les critères spéciauxQuery example: Use LIKE/NOT LIKE to do pattern matching

Description : Vérifiez qu’une valeur de champ sur l’événement correspond à un certain modèle.Description: Check that a field value on the event matches a certain pattern. Par exemple, vérifier que le résultat retourne des plaques d’immatriculation qui commencent par A et se terminent par 9.For example, check that the result returns license plates that start with A and end with 9.

Entrée:Input:

MarqueMake LicensePlateLicensePlate TimeTime
HondaHonda ABC-123ABC-123 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
ToyotaToyota AAA-999AAA-999 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
NissanNissan ABC-369ABC-369 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

Sortie:Output:

MarqueMake LicensePlateLicensePlate TimeTime
ToyotaToyota AAA-999AAA-999 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
NissanNissan ABC-369ABC-369 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

Solution:Solution:

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

Explication : Utilisez l’instruction LIKE pour vérifier la valeur du champ LicensePlate.Explanation: Use the LIKE statement to check the LicensePlate field value. Il doit commencer par la lettre A, puis avoir une chaîne de zéro ou plusieurs caractères et puis se terminer par le nombre 9.It should start with the letter A, then have any string of zero or more characters, and then end with the number 9.

Exemple de requête : Spécifier la logique de différentes casses/valeurs (instructions CASE)Query example: Specify logic for different cases/values (CASE statements)

Description : Fournissez un calcul différent pour un champ en fonction d’un critère particulier.Description: Provide a different computation for a field, based on a particular criterion. Par exemple, fournir une description de chaîne pour le nombre de voitures de la même marque avec une casse spéciale pour 1.For example, provide a string description for how many cars of the same make passed, with a special case for 1.

Entrée:Input:

MarqueMake TimeTime
HondaHonda 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
ToyotaToyota 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
ToyotaToyota 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

Sortie:Output:

CarsPassedCarsPassed TimeTime
1 Honda1 Honda 2015-01-01T00:00:10.0000000Z2015-01-01T00:00:10.0000000Z
2 Toyota2 Toyotas 2015-01-01T00:00:10.0000000Z2015-01-01T00:00:10.0000000Z

Solution:Solution:

    SELECT
        CASE
            WHEN COUNT(*) = 1 THEN CONCAT('1 ', Make)
            ELSE CONCAT(CAST(COUNT(*) AS NVARCHAR(MAX)), ' ', Make, 's')
        END AS CarsPassed,
        System.TimeStamp() AS Time
    FROM
        Input TIMESTAMP BY Time
    GROUP BY
        Make,
        TumblingWindow(second, 10)

Explication : L’expression CASE compare une expression à un ensemble d’expressions simples pour déterminer le résultat.Explanation: The CASE expression compares an expression to a set of simple expressions to determine the result. Dans cet exemple, les fabricants de véhicules avec un total de 1 ont retourné une description de chaîne différente de celle des fabricants avec un total différent de 1.In this example, vehicle makes with a count of 1 returned a different string description than vehicle makes with a count other than 1.

Exemple de requête : Envoyer des données à plusieurs sortiesQuery example: Send data to multiple outputs

Description : Envoyez des données à plusieurs cibles de sortie à partir d’un seul travail.Description: Send data to multiple output targets from a single job. Par exemple, analyser des données relatives à une alerte basée sur un seuil et archiver tous les événements dans le Stockage Blob.For example, analyze data for a threshold-based alert and archive all events to blob storage.

Entrée:Input:

MarqueMake TimeTime
HondaHonda 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
HondaHonda 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
ToyotaToyota 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
ToyotaToyota 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
ToyotaToyota 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

Output1:Output1:

MarqueMake TimeTime
HondaHonda 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
HondaHonda 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
ToyotaToyota 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
ToyotaToyota 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
ToyotaToyota 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

Output2:Output2:

MarqueMake TimeTime NombreCount
ToyotaToyota 2015-01-01T00:00:10.0000000Z2015-01-01T00:00:10.0000000Z 33

Solution:Solution:

    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

Explication : La clause INTO indique à Stream Analytics la sortie sur laquelle écrire les données à partir de cette instruction.Explanation: The INTO clause tells Stream Analytics which of the outputs to write the data to from this statement. La première requête est un transfert des données reçues vers une sortie nommée ArchiveOutput.The first query is a pass-through of the data received to an output named ArchiveOutput. La deuxième requête effectue une agrégation simple et filtrage et envoie les résultats vers un système d’alerte en aval, AlertOutput.The second query does some simple aggregation and filtering, and it sends the results to a downstream alerting system, AlertOutput.

Notez que vous pouvez également réutiliser les résultats d’expressions de table communes (par exemple avec des instructions WITH) dans plusieurs instructions de sortie.Note that you can also reuse the results of the common table expressions (CTEs) (such as WITH statements) in multiple output statements. Cette option a l’avantage d’ouvrir moins de lecteurs vers la source d’entrée.This option has the added benefit of opening fewer readers to the input source.

Exemple :For example:

    WITH AllRedCars AS (
        SELECT
            *
        FROM
            Input TIMESTAMP BY Time
        WHERE
            Color = 'red'
    )
    SELECT * INTO HondaOutput FROM AllRedCars WHERE Make = 'Honda'
    SELECT * INTO ToyotaOutput FROM AllRedCars WHERE Make = 'Toyota'

Exemple de requête : Compter des valeurs uniquesQuery example: Count unique values

Description : Comptez le nombre de valeurs de champ uniques qui apparaissent dans le flux au cours d’une fenêtre de temps.Description: Count the number of unique field values that appear in the stream within a time window. Par exemple, combien de voitures d’une même marque ont franchi le péage dans une fenêtre de temps de deux secondes ?For example, how many unique makes of cars passed through the toll booth in a 2-second window?

Entrée:Input:

MarqueMake TimeTime
HondaHonda 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
HondaHonda 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
ToyotaToyota 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
ToyotaToyota 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
ToyotaToyota 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z

Output:Output:

CountMakeCountMake 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

Solution :Solution:

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

Explication : COUNT(DISTINCT Make) retourne le nombre de valeurs distinctes de la colonne Marque dans une fenêtre de temps.Explanation: COUNT(DISTINCT Make) returns the number of distinct values in the Make column within a time window.

Exemple de requête : Déterminer si une valeur a changéQuery example: Determine if a value has changed

Description : Examinez une valeur précédente pour déterminer si elle est différente de la valeur actuelle.Description: Look at a previous value to determine if it is different than the current value. Par exemple, la voiture précédente sur la route à péage est-elle de la même marque que la voiture actuelle ?For example, is the previous car on the toll road the same make as the current car?

Entrée:Input:

MarqueMake TimeTime
HondaHonda 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
ToyotaToyota 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z

Sortie:Output:

MarqueMake TimeTime
ToyotaToyota 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z

Solution:Solution:

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

Explication : Utilisez LAG pour lire le flux d’entrée de l’événement précédent et obtenir la valeur Make.Explanation: Use LAG to peek into the input stream one event back and get the Make value. Ensuite, la comparer à la valeur Marque de l’événement en cours, puis générer l’événement si elles sont différentes.Then compare it to the Make value on the current event and output the event if they are different.

Exemple de requête : Rechercher le premier événement dans une fenêtreQuery example: Find the first event in a window

Description : Recherchez la première voiture dans chaque intervalle de 10 minutes.Description: Find the first car in every 10-minute interval.

Entrée:Input:

LicensePlateLicensePlate MarqueMake TimeTime
DXE 5291DXE 5291 HondaHonda 2015-07-27T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z
YZK 5704YZK 5704 FordFord 2015-07-27T00:02:17.0000000Z2015-07-27T00:02:17.0000000Z
RMV 8282RMV 8282 HondaHonda 2015-07-27T00:05:01.0000000Z2015-07-27T00:05:01.0000000Z
YHN 6970YHN 6970 ToyotaToyota 2015-07-27T00:06:00.0000000Z2015-07-27T00:06:00.0000000Z
VFE 1616VFE 1616 ToyotaToyota 2015-07-27T00:09:31.0000000Z2015-07-27T00:09:31.0000000Z
QYF 9358QYF 9358 HondaHonda 2015-07-27T00:12:02.0000000Z2015-07-27T00:12:02.0000000Z
MDR 6128MDR 6128 BMWBMW 2015-07-27T00:13:45.0000000Z2015-07-27T00:13:45.0000000Z

Sortie:Output:

LicensePlateLicensePlate MarqueMake TimeTime
DXE 5291DXE 5291 HondaHonda 2015-07-27T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z
QYF 9358QYF 9358 HondaHonda 2015-07-27T00:12:02.0000000Z2015-07-27T00:12:02.0000000Z

Solution:Solution:

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

Maintenant nous allons changer le problème et rechercher la première voiture d’une marque donnée dans chaque intervalle de 10 minutes.Now let's change the problem and find the first car of a particular make in every 10-minute interval.

LicensePlateLicensePlate MarqueMake TimeTime
DXE 5291DXE 5291 HondaHonda 2015-07-27T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z
YZK 5704YZK 5704 FordFord 2015-07-27T00:02:17.0000000Z2015-07-27T00:02:17.0000000Z
YHN 6970YHN 6970 ToyotaToyota 2015-07-27T00:06:00.0000000Z2015-07-27T00:06:00.0000000Z
QYF 9358QYF 9358 HondaHonda 2015-07-27T00:12:02.0000000Z2015-07-27T00:12:02.0000000Z
MDR 6128MDR 6128 BMWBMW 2015-07-27T00:13:45.0000000Z2015-07-27T00:13:45.0000000Z

Solution:Solution:

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

Exemple de requête : Rechercher le dernier événement dans une fenêtreQuery example: Find the last event in a window

Description : Recherchez la dernière voiture dans chaque intervalle de 10 minutes.Description: Find the last car in every 10-minute interval.

Entrée:Input:

LicensePlateLicensePlate MarqueMake TimeTime
DXE 5291DXE 5291 HondaHonda 2015-07-27T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z
YZK 5704YZK 5704 FordFord 2015-07-27T00:02:17.0000000Z2015-07-27T00:02:17.0000000Z
RMV 8282RMV 8282 HondaHonda 2015-07-27T00:05:01.0000000Z2015-07-27T00:05:01.0000000Z
YHN 6970YHN 6970 ToyotaToyota 2015-07-27T00:06:00.0000000Z2015-07-27T00:06:00.0000000Z
VFE 1616VFE 1616 ToyotaToyota 2015-07-27T00:09:31.0000000Z2015-07-27T00:09:31.0000000Z
QYF 9358QYF 9358 HondaHonda 2015-07-27T00:12:02.0000000Z2015-07-27T00:12:02.0000000Z
MDR 6128MDR 6128 BMWBMW 2015-07-27T00:13:45.0000000Z2015-07-27T00:13:45.0000000Z

Sortie:Output:

LicensePlateLicensePlate MarqueMake TimeTime
VFE 1616VFE 1616 ToyotaToyota 2015-07-27T00:09:31.0000000Z2015-07-27T00:09:31.0000000Z
MDR 6128MDR 6128 BMWBMW 2015-07-27T00:13:45.0000000Z2015-07-27T00:13:45.0000000Z

Solution:Solution:

    WITH LastInWindow AS
    (
        SELECT 
            MAX(Time) AS LastEventTime
        FROM 
            Input TIMESTAMP BY Time
        GROUP BY 
            TumblingWindow(minute, 10)
    )
    SELECT 
        Input.LicensePlate,
        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

Explication : La requête contient deux étapes.Explanation: There are two steps in the query. La première recherche l’horodatage le plus récent dans les fenêtres de 10 minutes.The first one finds the latest time stamp in 10-minute windows. La deuxième joint les résultats de la première requête avec le flux d’origine pour rechercher les événements qui correspondent aux derniers horodatages dans chaque fenêtre.The second step joins the results of the first query with the original stream to find the events that match the last time stamps in each window.

Exemple de requête : Détecter l’absence d’événementsQuery example: Detect the absence of events

Description : Vérifiez qu’un flux n’a pas de valeur correspondant à un critère particulier.Description: Check that a stream has no value that matches a certain criterion. Par exemple, deux voitures consécutives de la même marque se sont-elles engagées dans la route à péage durant les 90 dernières secondes ?For example, have 2 consecutive cars from the same make entered the toll road within the last 90 seconds?

Entrée:Input:

MarqueMake LicensePlateLicensePlate TimeTime
HondaHonda ABC-123ABC-123 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
HondaHonda AAA-999AAA-999 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z
ToyotaToyota DEF-987DEF-987 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z
HondaHonda GHI-345GHI-345 2015-01-01T00:00:04.0000000Z2015-01-01T00:00:04.0000000Z

Sortie:Output:

MarqueMake TimeTime CurrentCarLicensePlateCurrentCarLicensePlate FirstCarLicensePlateFirstCarLicensePlate FirstCarTimeFirstCarTime
HondaHonda 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

Solution:Solution:

    SELECT
        Make,
        Time,
        LicensePlate AS CurrentCarLicensePlate,
        LAG(LicensePlate, 1) OVER (LIMIT DURATION(second, 90)) AS FirstCarLicensePlate,
        LAG(Time, 1) OVER (LIMIT DURATION(second, 90)) AS FirstCarTime
    FROM
        Input TIMESTAMP BY Time
    WHERE
        LAG(Make, 1) OVER (LIMIT DURATION(second, 90)) = Make

Explication : Utilisez LAG pour lire le flux d’entrée de l’événement précédent et obtenir la valeur Make.Explanation: Use LAG to peek into the input stream one event back and get the Make value. La comparer à la valeur Marque de l’événement en cours, puis générer l’événement si elles sont identiques.Compare it to the MAKE value in the current event, and then output the event if they are the same. Vous pouvez également utiliser LAG pour obtenir des données relatives à la voiture précédente.You can also use LAG to get data about the previous car.

Exemple de requête : Détecter la durée entre événementsQuery example: Detect the duration between events

Description : Recherchez la durée d’un événement donné.Description: Find the duration of a given event. Par exemple, sur la base d’un parcours web, déterminer le temps passé sur une fonctionnalité.For example, given a web clickstream, determine the time spent on a feature.

Entrée:Input:

UtilisateurUser FonctionnalitéFeature ÉvénementEvent TimeTime
user@location.com RightMenuRightMenu DémarrerStart 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
user@location.com RightMenuRightMenu TerminerEnd 2015-01-01T00:00:08.0000000Z2015-01-01T00:00:08.0000000Z

Sortie:Output:

UtilisateurUser FonctionnalitéFeature DurationDuration
user@location.com RightMenuRightMenu 77

Solution:Solution:

    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'

Explication : Utilisez la fonction LAST pour récupérer la dernière valeur TIME quand le type d’événement était Start.Explanation: Use the LAST function to retrieve the last TIME value when the event type was Start. Notez que la fonction LAST utilise PARTITION BY [user] pour indiquer que le résultat est calculé par utilisateur unique.The LAST function uses PARTITION BY [user] to indicate that the result is computed per unique user. La requête a un seuil maximal d’une heure pour la différence de temps entre les événements Démarrer et Terminer (LIMIT DURATION(hour, 1), mais ce seuil est configurable en fonction des besoins.The query has a 1-hour maximum threshold for the time difference between Start and Stop events, but is configurable as needed (LIMIT DURATION(hour, 1).

Exemple de requête : Détecter la durée d’une conditionQuery example: Detect the duration of a condition

Description : Recherchez la durée d’une condition.Description: Find out how long a condition occurred. Par exemple, supposons qu’à la suite d’un bogue, le poids de toutes les voitures soit incorrect (supérieur 20 000 livres) et que la durée de ce bogue doive être calculée.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.

Entrée:Input:

MarqueMake TimeTime PoidsWeight
HondaHonda 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z 20002000
ToyotaToyota 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z 2500025000
HondaHonda 2015-01-01T00:00:03.0000000Z2015-01-01T00:00:03.0000000Z 2600026000
ToyotaToyota 2015-01-01T00:00:04.0000000Z2015-01-01T00:00:04.0000000Z 2500025000
HondaHonda 2015-01-01T00:00:05.0000000Z2015-01-01T00:00:05.0000000Z 2600026000
ToyotaToyota 2015-01-01T00:00:06.0000000Z2015-01-01T00:00:06.0000000Z 2500025000
HondaHonda 2015-01-01T00:00:07.0000000Z2015-01-01T00:00:07.0000000Z 2600026000
ToyotaToyota 2015-01-01T00:00:08.0000000Z2015-01-01T00:00:08.0000000Z 20002000

Sortie:Output:

StartFaultStartFault EndFaultEndFault
2015-01-01T00:00:02.000Z2015-01-01T00:00:02.000Z 2015-01-01T00:00:07.000Z2015-01-01T00:00:07.000Z

Solution:Solution:

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

    SELECT 
        LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN previousWeight < 20000 ) [StartFault],
        previousTime [EndFault]
    FROM SelectPreviousEvent
    WHERE
        [weight] < 20000
        AND previousWeight > 20000

Explication : Utilisez LAG pour voir le flux d’entrée sur 24 heures et recherchez les instances où StartFault et StopFault sont couverts par la condition de poids < 20000.Explanation: Use LAG to view the input stream for 24 hours and look for instances where StartFault and StopFault are spanned by the weight < 20000.

Exemple de requête : Indiquer les valeurs manquantesQuery example: Fill missing values

Description : Pour le flux des événements qui ont des valeurs manquantes, produisez un flux d’événements à intervalles réguliers.Description: For the stream of events that have missing values, produce a stream of events with regular intervals. Par exemple, générer toutes les cinq secondes un événement qui indique le point de données le plus récemment observé.For example, generate an event every 5 seconds that reports the most recently seen data point.

Entrée:Input:

tt valuevalue
"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" 5.5
"2014-01-01T06:01:35""2014-01-01T06:01:35" 6.6

Sortie (10 premières lignes):Output (first 10 rows):

windowendwindowend lastevent.tlastevent.t lastevent.valuelastevent.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 5.5
2014-01-01T14:01:35.000Z2014-01-01T14:01:35.000Z 2014-01-01T14:01:35.000Z2014-01-01T14:01:35.000Z 6.6
2014-01-01T14:01:40.000Z2014-01-01T14:01:40.000Z 2014-01-01T14:01:35.000Z2014-01-01T14:01:35.000Z 6.6
2014-01-01T14:01:45.000Z2014-01-01T14:01:45.000Z 2014-01-01T14:01:35.000Z2014-01-01T14:01:35.000Z 6.6

Solution:Solution:

    SELECT
        System.Timestamp() AS windowEnd,
        TopOne() OVER (ORDER BY t DESC) AS lastEvent
    FROM
        input TIMESTAMP BY t
    GROUP BY HOPPINGWINDOW(second, 300, 5)

Explication : Cette requête génère des événements toutes les 5 secondes et produit le dernier événement précédemment reçu.Explanation: This query generates events every 5 seconds and outputs the last event that was received previously. Le fenêtre récurrente durée détermine jusqu’où la requête remonte pour rechercher le dernier événement (300 secondes dans cet exemple).The Hopping window duration determines how far back the query looks to find the latest event (300 seconds in this example).

Exemple de requête : Mettre en corrélation deux types d’événement dans le même fluxQuery example: Correlate two event types within the same stream

Description : Les alertes doivent parfois être générées en fonction de plusieurs types d’événements qui se sont produits au cours d’un intervalle de temps donné.Description: Sometimes alerts need to be generated based on multiple event types that occurred in a certain time range. Par exemple, dans un scénario IoT concernant des fours domestiques, une alerte doit être générée quand la température du ventilateur est inférieure à 40 et que la puissance maximale au cours des 3 dernières minutes est inférieure à 10.For example, in an IoT scenario for home ovens, an alert must be generated when the fan temperature is less than 40 and the maximum power during the last 3 minutes is less than 10.

Entrée:Input:

timetime deviceIddeviceId sensorNamesensorName valuevalue
« 2018-01-01T16:01:00 »"2018-01-01T16:01:00" « Oven1 »"Oven1" « temp »"temp" 120120
« 2018-01-01T16:01:00 »"2018-01-01T16:01:00" « Oven1 »"Oven1" « power »"power" 1515
« 2018-01-01T16:02:00 »"2018-01-01T16:02:00" « Oven1 »"Oven1" « temp »"temp" 100100
« 2018-01-01T16:02:00 »"2018-01-01T16:02:00" « Oven1 »"Oven1" « power »"power" 1515
« 2018-01-01T16:03:00 »"2018-01-01T16:03:00" « Oven1 »"Oven1" « temp »"temp" 7070
« 2018-01-01T16:03:00 »"2018-01-01T16:03:00" « Oven1 »"Oven1" « power »"power" 1515
« 2018-01-01T16:04:00 »"2018-01-01T16:04:00" « Oven1 »"Oven1" « temp »"temp" 5050
« 2018-01-01T16:04:00 »"2018-01-01T16:04:00" « Oven1 »"Oven1" « power »"power" 1515
« 2018-01-01T16:05:00 »"2018-01-01T16:05:00" « Oven1 »"Oven1" « temp »"temp" 3030
« 2018-01-01T16:05:00 »"2018-01-01T16:05:00" « Oven1 »"Oven1" « power »"power" 88
« 2018-01-01T16:06:00 »"2018-01-01T16:06:00" « Oven1 »"Oven1" « temp »"temp" 2020
« 2018-01-01T16:06:00 »"2018-01-01T16:06:00" « Oven1 »"Oven1" « power »"power" 88
« 2018-01-01T16:07:00 »"2018-01-01T16:07:00" « Oven1 »"Oven1" « temp »"temp" 2020
« 2018-01-01T16:07:00 »"2018-01-01T16:07:00" « Oven1 »"Oven1" « power »"power" 88
« 2018-01-01T16:08:00 »"2018-01-01T16:08:00" « Oven1 »"Oven1" « temp »"temp" 2020
« 2018-01-01T16:08:00 »"2018-01-01T16:08:00" « Oven1 »"Oven1" « power »"power" 88

Sortie:Output:

eventTimeeventTime deviceIddeviceId temptemp alertMessagealertMessage maxPowerDuringLast3minsmaxPowerDuringLast3mins
« 2018-01-01T16:05:00 »"2018-01-01T16:05:00" « Oven1 »"Oven1" 3030 « Short circuit heating elements »"Short circuit heating elements" 1515
« 2018-01-01T16:06:00 »"2018-01-01T16:06:00" « Oven1 »"Oven1" 2020 « Short circuit heating elements »"Short circuit heating elements" 1515
« 2018-01-01T16:07:00 »"2018-01-01T16:07:00" « Oven1 »"Oven1" 2020 « Short circuit heating elements »"Short circuit heating elements" 1515

Solution:Solution:

WITH max_power_during_last_3_mins AS (
    SELECT 
        System.TimeStamp() AS windowTime,
        deviceId,
        max(value) as maxPower
    FROM
        input TIMESTAMP BY t
    WHERE 
        sensorName = 'power' 
    GROUP BY 
        deviceId, 
        SlidingWindow(minute, 3) 
)

SELECT 
    t1.t AS eventTime,
    t1.deviceId, 
    t1.value AS temp,
    'Short circuit heating elements' as alertMessage,
    t2.maxPower AS maxPowerDuringLast3mins
    
INTO resultsr

FROM input t1 TIMESTAMP BY t
JOIN max_power_during_last_3_mins t2
    ON t1.deviceId = t2.deviceId 
    AND t1.t = t2.windowTime
    AND DATEDIFF(minute,t1,t2) between 0 and 3
    
WHERE
    t1.sensorName = 'temp'
    AND t1.value <= 40
    AND t2.maxPower > 10

Explication : La première requête max_power_during_last_3_mins utilise la fenêtre glissante pour rechercher la valeur maximale du capteur de puissance pour chaque appareil, au cours des 3 dernières minutes.Explanation: The first query max_power_during_last_3_mins, uses the Sliding window to find the max value of the power sensor for every device, during the last 3 minutes. La seconde requête est jointe à la première pour rechercher la valeur de la puissance dans la fenêtre la plus récente, pertinente pour l’événement actuel.The second query is joined to the first query to find the power value in the most recent window relevant for the current event. Une alerte est alors générée pour l’appareil sous réserve que les conditions soient remplies.And then, provided the conditions are met, an alert is generated for the device.

Exemple de requête : Traiter les événements indépendamment des décalages entre horloges d’appareil (sous-flux)Query example: Process events independent of Device Clock Skew (substreams)

Description : Les événements peuvent arriver en retard ou dans le désordre en raison des décalages des horloges entre les producteurs d’événements, des décalages des horloges entre les partitions ou de la latence du réseau.Description: Events can arrive late or out of order due to clock skews between event producers, clock skews between partitions, or network latency. Dans l’exemple suivant, l’horloge de l’appareil pour TollID 2 est de cinq secondes derrière TollID 1, et l’horloge de l’appareil pour TollID 3 est dix secondes derrière TollID 1.In the following 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.

Entrée:Input:

LicensePlateLicensePlate MarqueMake TimeTime TollIDTollID
DXE 5291DXE 5291 HondaHonda 2015-07-27T00:00:01.0000000Z2015-07-27T00:00:01.0000000Z 11
YHN 6970YHN 6970 ToyotaToyota 2015-07-27T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z 11
QYF 9358QYF 9358 HondaHonda 2015-07-27T00:00:01.0000000Z2015-07-27T00:00:01.0000000Z 22
GXF 9462GXF 9462 BMWBMW 2015-07-27T00:00:04.0000000Z2015-07-27T00:00:04.0000000Z 22
VFE 1616VFE 1616 ToyotaToyota 2015-07-27T00:00:10.0000000Z2015-07-27T00:00:10.0000000Z 11
RMV 8282RMV 8282 HondaHonda 2015-07-27T00:00:03.0000000Z2015-07-27T00:00:03.0000000Z 33
MDR 6128MDR 6128 BMWBMW 2015-07-27T00:00:11.0000000Z2015-07-27T00:00:11.0000000Z 22
YZK 5704YZK 5704 FordFord 2015-07-27T00:00:07.0000000Z2015-07-27T00:00:07.0000000Z 33

Sortie:Output:

TollIDTollID NombreCount
11 22
22 22
11 11
33 11
22 11
33 11

Solution:Solution:

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

Explication : La clause TIMESTAMP BY OVER examine séparément la chronologie de chaque appareil en utilisant des sous-flux.Explanation: The TIMESTAMP BY OVER clause looks at each device timeline separately using substreams. Les événements de sortie pour chaque TollID sont générés tels qu’ils sont calculés, ce qui signifie que les événements sont dans l’ordre relativement à chaque TollID, au lieu d’être réorganisés comme si tous les appareils avaient la même horloge.The output events for each TollID are 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.

Exemple de requête : Supprimer des événements en double dans une fenêtreQuery example: Remove duplicate events in a window

Description : Quand vous effectuez une opération comme calculer des moyennes de plusieurs événements dans une fenêtre de temps donnée, les événements en double doivent être filtrés.Description: When performing an operation such as calculating averages over events in a given time window, duplicate events should be filtered. Dans l’exemple suivant, le deuxième événement est un doublon du premier.In the following example, the second event is a duplicate of the first.

Entrée:Input:

DeviceIDDeviceId TimeTime AttributAttribute ValeurValue
11 2018-07-27T00:00:01.0000000Z2018-07-27T00:00:01.0000000Z TempératureTemperature 5050
11 2018-07-27T00:00:01.0000000Z2018-07-27T00:00:01.0000000Z TempératureTemperature 5050
22 2018-07-27T00:00:01.0000000Z2018-07-27T00:00:01.0000000Z TempératureTemperature 4040
11 2018-07-27T00:00:05.0000000Z2018-07-27T00:00:05.0000000Z TempératureTemperature 6060
22 2018-07-27T00:00:05.0000000Z2018-07-27T00:00:05.0000000Z TempératureTemperature 5050
11 2018-07-27T00:00:10.0000000Z2018-07-27T00:00:10.0000000Z TempératureTemperature 100100

Sortie:Output:

AverageValueAverageValue DeviceIDDeviceId
7070 11
4545 22

Solution:Solution:

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)

Explication : COUNT(DISTINCT Time) retourne le nombre de valeurs distinctes de la colonne Time dans une fenêtre de temps.Explanation: COUNT(DISTINCT Time) returns the number of distinct values in the Time column within a time window. Vous pouvez ensuite utiliser la sortie de cette étape pour calculer la moyenne par appareil en ignorant les doublons.You can then use the output of this step to compute the average per device by discarding duplicates.

Obtenir de l’aideGet help

Pour obtenir une assistance, consultez le forum Azure Stream AnalyticsFor further assistance, try our Azure Stream Analytics forum.

Étapes suivantesNext steps