JOIN (Azure Stream Analytics)
Precis som standard-T-SQL används JOIN i Azure Stream Analytics-frågespråket för att kombinera poster från två eller flera indatakällor. JOIN i Azure Stream Analytics är temporala, vilket innebär att varje JOIN måste ange vissa gränser för hur långt matchande rader kan avgränsas i tid. Till exempel är "join TollBoothEntry events with TollBoothExit events when they occur on the same LicensePlate and TollId and within 5 minutes of each other" legitimt. men "join TollBoothEntry events with TollBoothExit events when they occur on the LicensePlate and TollId" is not – it would match each TollBoothEntry with an unbounded and potentially infinite collection of all TollBoothExit to the same LicensePlate and TollId.
Tidsintervallen för relationen anges i ON-satsen i JOIN med hjälp av funktionen DATEDIFF. Den maximala DATEIFF-storleken är sju dagar. Mer information om dess allmänna användning finns i DATEDIFF (Azure Stream Analytics). När DATEDIFF används i JOIN-villkoret får den andra och tredje parametern särskild behandling.
Det går dessutom inte att använda SELECT * i JOIN-instruktioner.
Syntax
[ FROM { <input_source> } [ ,...n ] ]
<input_source> ::=
{
input_name [ [ AS ] input_alias ]
| <joined_table>
}
<joined_table> ::=
{
<input_source> <join_type> <input_source> ON <join_condition>
| [ <input_source> <join_type> <reference_data> ON <join_condition> ]
| [ ( ] <joined_table> [ ) ]
}
<join_type> ::=
[ { INNER | LEFT [ OUTER ] } ] JOIN
Argument
<input_source>
Anger indatakällan.
<reference_data>
Referensdata som du vill ansluta till input_source. Mer information finns i avsnittet Referensdataanslutning.
<join_type>
Anger typen av kopplingsåtgärd.
Ansluta sig till
Anger att den angivna kopplingsåtgärden ska ske mellan de angivna indatakällorna och /eller referensdata. Alla rader från vänster och höger som uppfyller kopplingsvillkoret ingår i resultatuppsättningen.
Varning
Om JOIN-källorna är partitionerade måste JOIN-predikatet innehålla ett villkor som matchar partitionsnycklarna för båda källorna.
[ VÄNSTER YTTRE KOPPLING ]
Anger att alla rader från den vänstra tabellen som inte uppfyller kopplingsvillkoret ingår i resultatuppsättningen, och utdatakolumner från den andra tabellen är inställda på NULL utöver alla rader som returneras av den inre kopplingen.
PÅ <join_condition>
Anger det villkor som kopplingen baseras på. Kopplingsvillkoret måste ha ett tidsbundet eller ett tidsmässigt svängrum som definierats för relationen och anges i ON-satsen i JOIN, med hjälp av specialsyntaxen för funktionen Special DATEDIFF för JOIN.
Exempel
I Azure Stream Analytics har alla händelser en väldefinierad tidsstämpel. Användaren måste därför använda radalias direkt i funktionen DATEDIFF enligt följande:
SELECT I1.TollId, I1.EntryTime,I2.ExitTime, I1.LicensePlate, DATEDIFF(minute,I1.EntryTime,I2.ExitTime) AS DurationInMinutes
FROM Input1 I1 TIMESTAMP BY EntryTime
JOIN Input2 I2 TIMESTAMP BY ExitTime
ON DATEDIFF(minute,I1,I2) BETWEEN 0 AND 15
Kopplingsvillkoret ovan resulterar i en matchning om och endast om ExitTime inträffar efter EntryTime, men inte mer än 15 minuter senare.
Anteckning
DATEDIFF som används i SELECT-instruktionen använder den allmänna syntaxen där en datetime-kolumn eller ett uttryck skickas som den andra och tredje parametern. Men när funktionen DATEDIFF används i JOIN-villkoret används input_source namn eller alias. Internt väljs tidsstämpeln som är associerad för varje händelse i källan.
Tidsbundna villkor kan kombineras med varandra och med andra villkor i ON-satsen, t.ex.
SELECT I1.TollId, I1.EntryTime, I2.ExitTime, I1.LicensePlate, DATEDIFF(minute,I1.EntryTime,I2.ExitTime) AS DurationinMinutes
FROM Input1 I1 TIMESTAMP BY EntryTime
JOIN Input2 I2 TIMESTAMP BY ExitTime
ON I1.TollId=I2.TollId
AND I1.LicensePlate=I2.LicensePlate
AND DATEDIFF(minute,I1,I2) BETWEEN 0 AND 15
När du ansluter till tre eller flera tabeller gäller samma regler --- tidsintervall måste se till att alla matchade händelser inträffar inom en begränsad tidsperiod från varandra. För att till exempel hitta alla fel som inträffade mellan transaktionens start- och transaktionssluthändelse kan man säga:
SELECT TS.Id, TS.Name, TS.Amount, E.ErrorCode, E.Description
FROM TStart TS TIMESTAMP BY TStartTime
JOIN TEnd TE TIMESTAMP BY TEndTime
ON DATEDIFF(second, TS, TE) BETWEEEN 0 AND 5
AND TS.Id = TE.Id
JOIN Error E TIMESTAMP BY ErrorTime
ON DATEDIFF(second, TS, E) BETWEEN 0 AND 5
AND DATEDIFF(second, TE, E) < 0
AND E.TId = TS.Id
När du ansluter källor som är partitionerade måste JOIN-predikatet innehålla ett villkor som matchar partitionsnycklarna för båda källorna.
SELECT I1.TollId, I1.EntryTime,I2.ExitTime, I1.LicensePlate, DATEDIFF(minute,I1.EntryTime,I2.ExitTime) AS DurationInMinutes
FROM Input1 I1 TIMESTAMP BY EntryTime PARTITION BY PartitionId
JOIN Input2 I2 TIMESTAMP BY ExitTime PARTITION BY PartitionId
ON I1.PartitionId = I2.PartitionId AND DATEDIFF(minute,I1,I2) BETWEEN 0 AND 15
Slutligen stöder Azure Stream Analytics både inre koppling (standard) och vänster yttre koppling. För en inre koppling returneras resultatet bara om en matchning hittas. Men om en händelse från vänster sida i kopplingen är omatchad i en LEFT OUTER-koppling (vänster yttre) returneras en rad med Null för alla kolumner i den högra raden. Här är till exempel ett exempel för att hitta frånvaron av händelser. Följande fråga returnerar de rader där ett fordon har gått in i en avgiftsbelagd monter men inte har lämnat Booth inom 15 minuter.
SELECT I1.TollId, I1.EntryTime, I2.ExitTime, I1.LicensePlate, DATEDIFF(minute,I1.EntryTime,I2.ExitTime) AS DurationinMinutes
FROM Input1 I1 TIMESTAMP BY EntryTime
LEFT OUTER JOIN Input2 I2 TIMESTAMP BY ExitTime
ON I1.TollId=I2.TollId
AND I1.LicensePlate=I2.LicensePlate
AND DATEDIFF( minute , I1 , I2 ) BETWEEN 0 AND 15
WHERE I2.TollId IS NULL
Särskild DATEDIFF-funktion för JOIN
Syntax
DATEDIFF ( datepart , input_source1, input_source2 )
Argument
dateparts
Exempel: "second", "millisekunder", "minut" osv.)
input_source1
Den första indatakällan i joinen. Internt skickas tidsstämpeln som är associerad med händelserna från den här input_source till funktionen.
input_source2
Den andra indatakällan i joinen. Internt skickas tidsstämpeln som är associerad med händelserna från den här input_source till funktionen.
Returtyp
Returnerar antalet enheter i dateparts som förflutit från tidsstämpeln för input_source1 till tidsstämpeln för input_source2. Det returnerade värdet kan vara negativt om tidsstämpeln för andra input_source är större än den första.