JOIN (Azure Stream Analytics)
Podobnie jak w przypadku standardowego języka T-SQL, funkcja JOIN w języku zapytań usługi Azure Stream Analytics służy do łączenia rekordów z co najmniej dwóch źródeł wejściowych. Funkcja JOIN w usłudze Azure Stream Analytics ma charakter czasowy, co oznacza, że każda funkcja JOIN musi zapewnić pewne ograniczenia dotyczące tego, jak daleko można oddzielić pasujące wiersze w czasie. Na przykład powiedzenie "dołącz do zdarzeń TollBoothEntry za pomocą zdarzeń TollBoothExit, gdy występują one na tym samym licensePlate i TollId i w ciągu 5 minut od siebie" jest uzasadnione; ale "dołącz do zdarzeń TollBoothEntry z zdarzeniami TollBoothExit, gdy występują na platformie LicensePlate i TollId", nie jest — będzie to zgodne z każdym TollBoothEntry z niezwiązaną i potencjalnie nieskończoną kolekcją wszystkich TollBoothExit do tego samego LicensePlate i TollId.
Granice czasu dla relacji są określone wewnątrz klauzuli ON join przy użyciu funkcji DATEDIFF. Maksymalny rozmiar DATEDIFF wynosi siedem dni. Aby uzyskać więcej informacji na temat ogólnego użycia, zobacz DATEDIFF (Azure Stream Analytics). Gdy funkcja DATEDIFF jest używana w stanie JOIN, drugi i trzeci parametr uzyskuje specjalne leczenie.
Ponadto funkcji SELECT * nie można używać w instrukcjach JOIN.
Składnia
[ 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>
Określa wejściowe źródło danych.
<reference_data>
Dane referencyjne, do których chcesz dołączyć input_source. Aby uzyskać więcej informacji, zobacz sekcję Dołączanie do danych referencyjnych.
<join_type>
Określa typ operacji sprzężenia.
DOŁĄCZYĆ
Wskazuje, że określona operacja sprzężenia powinna wystąpić między określonymi źródłami wejściowymi i /lub danymi referencyjnymi. Wszystkie wiersze z lewej i prawej strony są uwzględniane w zestawie wyników.
Ostrzeżenie
Jeśli źródła JOIN są partycjonowane, predykat JOIN musi zawierać warunek pasujący do kluczy partycji obu źródeł.
[ LEWE SPRZĘŻENIA ZEWNĘTRZNE ]
Określa, że wszystkie wiersze z tabeli po lewej stronie, które nie są spełnione warunek sprzężenia, są uwzględniane w zestawie wyników, a kolumny wyjściowe z innej tabeli są ustawione na wartość NULL oprócz wszystkich wierszy zwracanych przez sprzężenie wewnętrzne.
ON <join_condition>
Określa warunek, na którym opiera się sprzężenia. Warunek sprzężenia musi mieć ograniczenie czasu lub czasowy pokój przełącznika zdefiniowany dla relacji i jest określony wewnątrz klauzuli ON join, używając specjalnej składni funkcji Special DATEDIFF dla funkcji JOIN.
Przykłady
W usłudze Azure Stream Analytics wszystkie zdarzenia mają dobrze zdefiniowany znacznik czasu. W związku z tym użytkownik musi używać aliasów wierszy bezpośrednio w funkcji DATEDIFF w następujący sposób:
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
Powyższy warunek sprzężenia spowoduje dopasowanie, jeśli i tylko wtedy, gdy exitTime wystąpi po EntryTime, ale nie więcej niż 15 minut później.
Uwaga
FUNKCJA DATEDIFF używana w instrukcji SELECT używa składni ogólnej, w której przekazywana jest kolumna lub wyrażenie daty/godziny jako drugi i trzeci parametr. Jednak gdy funkcja DATEDIFF jest używana wewnątrz warunku JOIN, używana jest nazwa input_source lub jej alias. Wewnętrznie sygnatura czasowa skojarzona dla każdego zdarzenia w tym źródle jest wybierana.
Warunki związane z czasem można łączyć ze sobą i z innymi warunkami wewnątrz klauzuli ON, np.:
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
Podczas łączenia trzech lub większej liczby tabel te same reguły stosują --- granice czasu, muszą upewnić się, że wszystkie dopasowane zdarzenia występują w ograniczonym czasie od siebie. Aby na przykład znaleźć wszystkie błędy, które wystąpiły między zdarzeniem rozpoczęcia transakcji i zakończenia transakcji, można powiedzieć:
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
Podczas łączenia źródeł partycjonowanych predykat JOIN musi zawierać warunek zgodny z kluczami partycji obu źródeł.
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
Na koniec usługa Azure Stream Analytics obsługuje zarówno sprzężenie wewnętrzne (domyślne) jak i sprzężenie zewnętrzne LEFT. W przypadku sprzężenia wewnętrznego wynik jest zwracany tylko wtedy, gdy zostanie znalezione dopasowanie. Natomiast w przypadku sprzężenia LEFT OUTER, jeśli zdarzenie z lewej strony sprzężenia jest niedopasowane, dla wszystkich kolumn prawego wiersza jest zwracany wiersz z wartością NULL. Na przykład poniżej przedstawiono przykład braku zdarzeń. Następujące zapytanie zwróci te wiersze, w których pojazd wszedł do toll booth, ale nie wyszedł z budki w ciągu 15 minut.
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
Specjalna funkcja DATEDIFF dla FUNKCJI JOIN
Składnia
DATEDIFF ( datepart , input_source1, input_source2 )
Argumenty
Dateparts
Przykład. "second", "milisekund", "minute" itp.)
input_source1
Pierwsze źródło danych wejściowych w sprzężeniu. Wewnętrznie sygnatura czasowa skojarzona ze zdarzeniami z tego input_source jest przekazywana do funkcji.
input_source2
Drugie źródło danych wejściowych w sprzężeniu. Wewnętrznie sygnatura czasowa skojarzona ze zdarzeniami z tego input_source jest przekazywana do funkcji.
Typ zwracany
Zwraca liczbę jednostek w częściach dat, które upłynęły ze znacznika czasu input_source1 do znacznika czasu input_source2. Zwrócona wartość może być ujemna, jeśli sygnatura czasowa drugiej input_source jest większa niż pierwsza.