Esempi di query per modelli di uso comune di Analisi di flussoQuery examples for common Stream Analytics usage patterns

IntroduzioneIntroduction

Le query in Analisi di flusso di Azure sono espresse in un linguaggio di query di tipo SQL.Queries in Azure Stream Analytics are expressed in a SQL-like query language. Questi costrutti di linguaggio sono documentati nella guida Informazioni di riferimento sul linguaggio di query di Analisi di flusso.The language constructs are documented in the Stream Analytics query language reference guide.

La progettazione delle query può definire una logica pass-through semplice per spostare i dati degli eventi da un flusso di input in un altro archivio dati di output.The query design can express simple pass-through logic to move event data from one input stream into another output data store. In alternativa, è possibile eseguire criteri di ricerca e analisi temporali avanzate per calcolare le aggregazioni attraverso diverse finestre temporali, come nel TollApp di esempio.Or it can do rich pattern matching and temporal analysis to calculate aggregates over various time windows as in the TollApp sample. È possibile aggiungere dati da più input per combinare flussi di eventi ed eseguire ricerche sui dati di riferimento statici per arricchire i valori degli eventi.You can join data from multiple inputs to combine streaming events, and do lookups against static reference data to enrich the event values. È anche possibile scrivere dati per più output.Also you can write data to multiple outputs.

Questo articolo illustra le soluzioni per diversi modelli di query comuni basati su scenari reali.This article outlines solutions to several common query patterns, based on real-world scenarios. È un lavoro in corso che continua a essere periodicamente aggiornato con nuovi modelli.It is a work in progress and continues to be updated with new patterns on an ongoing basis.

Esempio di query: convertire tipi di datiQuery example: Convert data types

Descrizione: definire i tipi di proprietà nel flusso di input.Description: Define the types of properties on the input stream. Il peso dell'auto, ad esempio, viene immesso nel flusso di input come stringa e deve essere convertito in INT per eseguire l'operazione SUM dei valori.For example, the car weight is coming on the input stream as strings and needs to be converted to INT to perform SUM it up.

Input:Input:

AssicurarsiMake TempoTime PesoWeight
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"

Output:Output:

AssicurarsiMake PesoWeight
HondaHonda 30003000

Soluzione:Solution:

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

Spiegazione: usare un'istruzione CAST nel campo Peso per specificarne il tipo di dati.Explanation: Use a CAST statement in the Weight field to specify its data type. Visualizzare l'elenco dei tipi di dati supportati in Tipi di dati (Analisi di flusso di Azure).See the list of supported data types in Data types (Azure Stream Analytics).

Esempio di query: Usare Like/Not like per la corrispondenza dei modelliQuery example: Use Like/Not like to do pattern matching

Descrizione: verificare che un valore del campo dell'evento corrisponda a un determinato modello.Description: Check that a field value on the event matches a certain pattern. Verificare, ad esempio, che il risultato restituisca le targhe che iniziano per A e terminano con 9.For example, check that the result returns license plates that start with A and end with 9.

Input:Input:

AssicurarsiMake TargaLicensePlate TempoTime
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

Output:Output:

AssicurarsiMake TargaLicensePlate TempoTime
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

Soluzione:Solution:

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

Spiegazione: usare l'istruzione LIKE per verificare che il valore del campo LicensePlateExplanation: Use the LIKE statement to check the LicensePlate field value. inizi con la lettera A, contenga una stringa di zeri o altri caratteri e termini con 9.It should start with an A, then have any string of zero or more characters, and then end with a 9.

Esempio di query: Specificare la logica per i diversi casi/valori (istruzioni CASE)Query example: Specify logic for different cases/values (CASE statements)

Descrizione: fornire un calcolo diverso per un campo in base un determinato criterio.Description: Provide a different computation for a field, based on a particular criterion. Fornire ad esempio una stringa descrittiva relativa al numero di automobili della stessa casa automobilistica che sono passate, con un caso speciale impostato su 1.For example, provide a string description for how many cars of the same make passed, with a special case for 1.

Input:Input:

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

Output:Output:

Auto passateCarsPassed TempoTime
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

Soluzione: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)

Spiegazione: l'espressione CASE confronta un'espressione con un set di espressioni semplici per determinare il risultato.Explanation: The CASE expression compares an expression to a set of simple expressions to determine the result. In questo esempio, le marche di veicolo con un conteggio pari a 1 hanno restituito una stringa descrittiva diversa da quella delle marche di veicolo con un numero diverso da 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.

Esempio di query: Invio di dati a più outputQuery example: Send data to multiple outputs

Descrizione: inviare dati a più destinazioni di output da un singolo processo.Description: Send data to multiple output targets from a single job. Analizzare, ad esempio, i dati per un avviso basato su soglie e archiviare tutti gli eventi nell'archiviazione BLOB.For example, analyze data for a threshold-based alert and archive all events to blob storage.

Input:Input:

AssicurarsiMake TempoTime
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:

AssicurarsiMake TempoTime
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:

AssicurarsiMake TempoTime ConteggioCount
ToyotaToyota 2015-01-01T00:00:10.0000000Z2015-01-01T00:00:10.0000000Z 33

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

Spiegazione: la clausola INTO indica all'Analisi di flusso in quali output scrivere i dati ottenuti con questa istruzione.Explanation: The INTO clause tells Stream Analytics which of the outputs to write the data to from this statement. La prima è una query pass-through dei dati ricevuti per un output denominato ArchiveOutput.The first query is a pass-through of the data received to an output that named ArchiveOutput. La seconda query effettua una semplice aggregazione, filtra e invia i risultati a un sistema di avviso downstream.The second query does some simple aggregation and filtering, and it sends the results to a downstream alerting system.

È anche possibile riusare i risultati delle espressioni di tabella comune (CTE), ovvero le istruzioni WITH, in più istruzioni di output.Note that you can also reuse the results of the common table expressions (CTEs) (such as WITH statements) in multiple output statements. Questa opzione offre il vantaggio aggiuntivo di aprire un numero inferiore di lettori nell'origine di input.This option has the added benefit of opening fewer readers to the input source. Ad esempio: 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'

Esempio di query: contare valori univociQuery example: Count unique values

Descrizione: contare il numero di valori di campo univoci presenti nel flusso in un intervallo di tempo.Description: Count the number of unique field values that appear in the stream within a time window. Ad esempio, quante automobili appartenenti alla stessa casa automobilistica sono passate da un casello autostradale in una finestra di due secondi?For example, how many unique makes of cars passed through the toll booth in a 2-second window?

Input:Input:

AssicurarsiMake TempoTime
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 TempoTime
22 2015-01-01T00:00:02.000Z2015-01-01T00:00:02.000Z
11 2015-01-01T00:00:04.000Z2015-01-01T00:00:04.000Z

Soluzione:Solution:

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

Spiegazione: COUNT(DISTINCT Make) restituisce il numero di valori distinct della colonna Casa automobilistica all'interno di una finestra temporale.Explanation: COUNT(DISTINCT Make) returns the number of distinct values in the Make column within a time window.

Esempio di query: Determinare la potenziale variazione di un valoreQuery example: Determine if a value has changed

Descrizione: esaminare un valore precedente per determinare se è diverso rispetto al valore corrente.Description: Look at a previous value to determine if it is different than the current value. L'auto precedente passata dal casello autostradale, ad esempio, è della stessa casa automobilistica dell'auto corrente?For example, is the previous car on the toll road the same make as the current car?

Input:Input:

AssicurarsiMake TempoTime
HondaHonda 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
ToyotaToyota 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z

Output:Output:

AssicurarsiMake TempoTime
ToyotaToyota 2015-01-01T00:00:02.0000000Z2015-01-01T00:00:02.0000000Z

Soluzione:Solution:

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

Spiegazione: usare LAG per esaminare il flusso di input di un evento precedente e ottenere il valore Casa automobilistica.Explanation: Use LAG to peek into the input stream one event back and get the Make value. Confrontarlo quindi con il valore Casa automobilistica dell'evento corrente per restituire l'evento di variazione.Then compare it to the Make value on the current event and output the event if they are different.

Esempio di query: trovare il primo evento in una finestraQuery example: Find the first event in a window

Descrizione: trovare la prima auto in ogni intervallo di 10 minuti.Description: Find the first car in every 10-minute interval.

Input:Input:

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

Output:Output:

TargaLicensePlate AssicurarsiMake TempoTime
DXE 5291DXE 5291 HondaHonda 27-07-2015T00:00:05.0000000Z2015-07-27T00:00:05.0000000Z
QYF 9358QYF 9358 HondaHonda 27-07-2015T00:12:02.0000000Z2015-07-27T00:12:02.0000000Z

Soluzione:Solution:

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

Si ridefinirà ora il problema per trovare la prima auto di una particolare casa automobilistica a intervalli di 10 minuti.Now let’s change the problem and find the first car of a particular make in every 10-minute interval.

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

Soluzione:Solution:

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

Esempio di query: trovare l'ultimo evento in una finestraQuery example: Find the last event in a window

Descrizione: trovare l'ultima auto in ogni intervallo di 10 minuti.Description: Find the last car in every 10-minute interval.

Input:Input:

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

Output:Output:

TargaLicensePlate AssicurarsiMake TempoTime
VFE 1616VFE 1616 ToyotaToyota 27-07-2015T00:09:31.0000000Z2015-07-27T00:09:31.0000000Z
MDR 6128MDR 6128 BMWBMW 27-07-2015T00:13:45.0000000Z2015-07-27T00:13:45.0000000Z

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

Spiegazione: la query si articola in due passaggi.Explanation: There are two steps in the query. Il primo rileva il timestamp più recente in finestre di 10 minuti,The first one finds the latest time stamp in 10-minute windows. il secondo unisce i risultati della prima query con il flusso originale per trovare gli eventi corrispondenti ai timestamp più recenti in ogni finestra.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.

Esempio di query: Rilevare l'assenza di eventiQuery example: Detect the absence of events

Descrizione: verificare che un flusso non abbia un valore corrispondente a determinati criteri.Description: Check that a stream has no value that matches a certain criterion. Ad esempio, 2 automobili consecutive della stessa casa automobilistica hanno attraversato il casello negli ultimi 90 secondi?For example, have 2 consecutive cars from the same make entered the toll road within the last 90 seconds?

Input:Input:

AssicurarsiMake TargaLicensePlate TempoTime
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

Output:Output:

AssicurarsiMake TempoTime Targa auto correnteCurrentCarLicensePlate Targa prima autoFirstCarLicensePlate Tempo prima autoFirstCarTime
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

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

Spiegazione: usare LAG per esaminare il flusso di input di un evento precedente e ottenere il valore Casa automobilistica.Explanation: Use LAG to peek into the input stream one event back and get the Make value. Confrontarlo quindi con il valore Casa automobilistica dell'evento corrente e, se corrispondono, restituire l'evento.Compare it to the MAKE value in the current event, and then output the event if they are the same. È possibile anche usare LAG per ottenere i dati relativi all'auto precedente.You can also use LAG to get data about the previous car.

Esempio di query: rilevare la durata tra gli eventiQuery example: Detect the duration between events

Descrizione: trovare la durata di un determinato evento.Description: Find the duration of a given event. Dato un clickstream Web, determinare ad esempio i tempi di una funzionalità.For example, given a web clickstream, determine the time spent on a feature.

Input:Input:

UtenteUser FunzionalitàFeature EventEvent TempoTime
user@location.com RightMenuRightMenu IniziaStart 2015-01-01T00:00:01.0000000Z2015-01-01T00:00:01.0000000Z
user@location.com RightMenuRightMenu EndEnd 2015-01-01T00:00:08.0000000Z2015-01-01T00:00:08.0000000Z

Output:Output:

UtenteUser FunzionalitàFeature DurationDuration
user@location.com RightMenuRightMenu 77

Soluzione: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'

Spiegazione: usare la funzione LAST per recuperare l'ultimo valore di TIME se il tipo di evento corrisponde a Start.Explanation: Use the LAST function to retrieve the last TIME value when the event type was Start. La funzione LAST usa PARTITION BY [user] per indicare che il risultato viene calcolato per utente univoco.The LAST function uses PARTITION BY [user] to indicate that the result is computed per unique user. La query dispone di una soglia massima di 1 ora per la differenza di tempo tra gli eventi Start e Stop, ma è configurabile in base alle esigenze: (LIMIT DURATION(hour, 1).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).

Esempio di query: rilevare la durata di una condizioneQuery example: Detect the duration of a condition

Descrizione: individuare la durata di una condizione.Description: Find out how long a condition occurred. Ad esempio, si supponga che un bug abbia generato un peso errato per tutte le automobili (oltre 20.000 libbre) e che debba essere calcolata la durata di tale bug.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.

Input:Input:

AssicurarsiMake TempoTime PesoWeight
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

Output:Output:

Inizio erroreStartFault Fine erroreEndFault
2015-01-01T00:00:02.000Z2015-01-01T00:00:02.000Z 2015-01-01T00:00:07.000Z2015-01-01T00:00:07.000Z

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

Spiegazione: usare LAG per visualizzare il flusso di input per 24 ore e cercare le istanze in cui StartFault e StopFault vengono intervallati in base al peso (< 20.000).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.

Esempio di query: immettere i valori mancantiQuery example: Fill missing values

Descrizione: per il flusso di eventi con i valori mancanti, generare un flusso di eventi con intervalli regolari.Description: For the stream of events that have missing values, produce a stream of events with regular intervals. Generare, ad esempio, un evento ogni 5 secondi che segnali il punto di dati più recente individuato.For example, generate an event every 5 seconds that reports the most recently seen data point.

Input: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" 55
"2014-01-01T06:01:35""2014-01-01T06:01:35" 66

Output (prime 10 righe):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 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

Soluzione: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)

Spiegazione: questa query genera eventi ogni cinque secondi e restituisce l'ultimo evento ricevuto in precedenza.Explanation: This query generates events every 5 seconds and outputs the last event that was received previously. La durata della finestra di salto determina fino a quando risale la query per cercare l'evento più recente. In questo esempio, 300 secondi.The Hopping window duration determines how far back the query looks to find the latest event (300 seconds in this example).

Esempio di query: correlare due tipi di evento all'interno dello stesso flussoQuery example: Correlate two event types within the same stream

Descrizione: a volte è necessario generare gli avvisi in base a più tipi di evento che si sono verificati in un determinato intervallo di tempo.Description: Sometimes alerts need to be generated based on multiple event types that occurred in a certain time range. Nello scenario IoT per forni domestici, ad esempio, deve essere generato un avviso quando la temperatura della ventola è inferiore a 40 e la potenza massima negli ultimi tre minuti è minore di 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.

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

Output:Output:

eventTimeeventTime deviceIddeviceId temptemp alertMessagealertMessage maxPowerDuringLast3minsmaxPowerDuringLast3mins
"2018-01-01T16:05:00""2018-01-01T16:05:00" "Oven1""Oven1" 3030 "Short circuit heating elements" (Corto circuito elementi riscaldanti)"Short circuit heating elements" 1515
"2018-01-01T16:06:00""2018-01-01T16:06:00" "Oven1""Oven1" 2020 "Short circuit heating elements" (Corto circuito elementi riscaldanti)"Short circuit heating elements" 1515
"2018-01-01T16:07:00""2018-01-01T16:07:00" "Oven1""Oven1" 2020 "Short circuit heating elements" (Corto circuito elementi riscaldanti)"Short circuit heating elements" 1515

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

Spiegazione: la prima query max_power_during_last_3_mins, usa la finestra scorrevole per trovare il valore massimo del sensore di alimentazione per ogni dispositivo, durante gli ultimi 3 minuti.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 seconda query viene unita alla prima query per trovare il valore di potenza nella finestra più recente rilevante per l'evento corrente.The second query is joined to the first query to find the power value in the most recent window relevant for the current event. A condizione che le condizioni siano soddisfatte, viene quindi generato un avviso per il dispositivo.And then, provided the conditions are met, an alert is generated for the device.

Esempio di query: elaborare eventi indipendenti dallo sfasamento di orario dei dispositivi (substream)Query example: Process events independent of Device Clock Skew (substreams)

Descrizione: gli eventi possono arrivare in ritardo o non in ordine a causa di sfasamenti di orario tra producer di eventi, sfasamenti di orario tra partizioni o latenza di rete.Description: Events can arrive late or out of order due to clock skews between event producers, clock skews between partitions, or network latency. Nell'esempio seguente il clock di dispositivo per TollID 2 è dieci secondi indietro rispetto a TollID 1 e il clock di dispositivo per TollID 3 è cinque secondi indietro rispetto a TollID 1.In the following example, the device clock for TollID 2 is ten seconds behind TollID 1, and the device clock for TollID 3 is five seconds behind TollID 1.

Input:Input:

TargaLicensePlate AssicurarsiMake TempoTime ID caselloTollID
DXE 5291DXE 5291 HondaHonda 2015-07-27T00:00:01.0000000Z2015-07-27T00:00:01.0000000Z 11
YHN 6970YHN 6970 ToyotaToyota 27-07-2015T00: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

Output:Output:

ID caselloTollID ConteggioCount
11 22
22 22
11 11
33 11
22 11
33 11

Soluzione:Solution:

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

Spiegazione: la clausola TIMESTAMP BY OVER esamina la sequenza temporale di ogni dispositivo separatamente tramite substream.Explanation: The TIMESTAMP BY OVER clause looks at each device timeline separately using substreams. Gli eventi di output per ogni TollID vengono generati man mano che vengono elaborati, vale a dire che gli eventi sono in ordine rispetto a ogni TollID anziché venire riordinati come se tutti i dispositivi fossero nello stesso clock.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.

Ottenere aiutoGet help

Per ulteriore assistenza, provare il Forum di Analisi dei flussi di Azure.For further assistance, try our Azure Stream Analytics forum.

Passaggi successiviNext steps