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í.