JOIN (Azure Stream Analytics)
Stejně jako standardní T-SQL se i JOIN v dotazovacím jazyce Azure Stream Analytics používá ke kombinování záznamů ze dvou nebo více vstupních zdrojů. FUNKCE JOIN ve službě Azure Stream Analytics má dočasnou povahu, což znamená, že každý join musí obsahovat určitá omezení, do jaké míry je možné odpovídající řádky v čase oddělit. Například výrok "připojit TollBoothEntry události s TollBoothExit události, když se vyskytují na stejném Licenčním a TollId a do 5 minut od sebe" je legitimní; Ale "připojit TollBoothEntry události s TollBoothExit událostí, když se vyskytují na LicensePlate a TollId" není – to by odpovídalo každému TollBoothEntry s neomezenou a potenciálně neomezenou kolekcí všech TollBoothExit na stejné LicensePlate a TollId.
Časové hranice relace jsou zadány v klauzuli ON join pomocí funkce DATEDIFF. Maximální velikost DATEDIFF je sedm dní. Další informace o jeho obecném použití najdete v tématu DATEDIFF (Azure Stream Analytics). Při použití funkce DATEDIFF v podmínce JOIN získá druhý a třetí parametr zvláštní ošetření.
Kromě toho nelze v příkazech JOIN použít příkaz SELECT *.
Syntaxe
[ 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
Argumenty
<input_source>
Určuje vstupní zdroj dat.
<reference_data>
Referenční data, ke kterým se chcete připojit ke svému input_source. Další informace najdete v části Referenční datové spojení.
<join_type>
Určuje typ operace spojení.
PŘIPOJIT
Označuje, že zadaná operace spojení by měla proběhnout mezi zadanými vstupními zdroji a /nebo referenčními daty. Do sady výsledků jsou zahrnuty všechny řádky zleva a zprava, které splňují podmínku spojení.
Upozornění
Pokud jsou zdroje JOIN rozdělené na oddíly, musí predikát JOIN obsahovat podmínku odpovídající klíčům oddílů obou zdrojů.
[ LEVÉ VNĚJŠÍ SPOJENÍ ]
Určuje, že všechny řádky z levé tabulky, které nesplňují podmínku spojení, budou zahrnuty do sady výsledků a výstupní sloupce z druhé tabulky budou nastaveny na hodnotu NULL kromě všech řádků vrácených vnitřním spojením.
ON <join_condition>
Určuje podmínku, na které je spojení založeno. Podmínka spojení musí mít pro relaci definovanou časově vázanou místnost nebo časovou místnost a je určena v klauzuli ON funkce JOIN pomocí speciální syntaxe funkce SPECIAL DATEDIFF pro funkci JOIN.
Příklady
Ve službě Azure Stream Analytics mají všechny události dobře definované časové razítko. Uživatel tedy musí používat aliasy řádků přímo ve funkci DATEDIFF, a to následujícím způsobem:
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
Výše uvedená podmínka spojení bude mít za následek shodu, pokud a pouze v případě, že exitTime nastane po EntryTime, ale ne déle než 15 minut později.
Poznámka
FUNKCE DATEDIFF použitá v příkazu SELECT používá obecnou syntaxi, kdy se sloupec datetime nebo výraz předá jako druhý a třetí parametr. Pokud se však v podmínce JOIN použije funkce DATEDIFF, použije se název input_source nebo jeho alias. Interně se vybere časové razítko přidružené ke každé události v daném zdroji.
Časově vázané podmínky se dají kombinovat mezi sebou a s dalšími podmínkami uvnitř klauzule ON, například:
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
Při spojování tří nebo více tabulek platí stejná pravidla, --- časové hranice musí zajistit, aby všechny odpovídající události probíhaly v konečné době od sebe. Například pokud chcete najít všechny chyby, ke kterým došlo mezi událostí zahájení transakce a ukončení transakce, můžete říct:
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
Při spojování dělených zdrojů musí predikát JOIN obsahovat podmínku odpovídající klíčům oddílů obou zdrojů.
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
Azure Stream Analytics nakonec podporuje vnitřní spojení (výchozí) i vnější levé spojení. Při použití vnitřního spojení se vrátí výsledek, pouze když je nalezena shoda. Spojení LEFT OUTER JOIN však v případě, že pro událost z levé strany spojení není nalezena shoda, vrátí řádek s hodnotami NULL pro všechny sloupce pravého řádku. Tady je například příklad, jak zjistit absenci událostí. Následující dotaz vrátí řádky, ve kterých vozidlo vstoupilo do placené budky, ale během 15 minut ho neopouští.
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
Speciální funkce DATEDIFF pro JOIN
Syntaxe
DATEDIFF ( datepart , input_source1, input_source2 )
Argumenty
části data
Příklad: "sekunda", "milisekunda", "minuta" atd.)
input_source1
První vstupní zdroj ve spojení. Do funkce se interně předává časové razítko přidružené k událostem z tohoto input_source.
input_source2
Druhý vstupní zdroj ve spojení. Do funkce se interně předává časové razítko přidružené k událostem z tohoto input_source.
Návratový typ
Vrátí počet jednotek v části kalendářního data, který uplynul od časového razítka input_source1 do časového razítka input_source2. Vrácená hodnota může být záporná, pokud je časové razítko druhé input_source větší než první.