ПРИСОЕДИНИТЬСЯ

✅ Поток событий Azure Stream Analytics ✅ Fabric

Как и стандартный T-SQL, JOIN на языке запросов Azure Stream Analytics используется для объединения записей из двух или нескольких источников входных данных. Join в Azure Stream Analytics является темпоральным, то есть каждый JOIN должен предоставлять некоторые ограничения на то, насколько далеко совпадающие строки могут быть разделены во времени. Например, говоря: "Присоединяйтесь к событиям TollBoothEntry с событиями TollBoothExit, когда они происходят на одном и том же LicensePlate и TollId и в течение 5 минут друг друга", является законным; но "присоединяйтесь к событиям TollBoothEntry с событиями TollBoothExit, когда они происходят на LicensePlate и TollId", не является - это будет соответствовать каждому tollBoothEntry с несвязанной и потенциально бесконечной коллекцией всех TollBoothExit с той же LicensePlate и TollId.

Границы времени для связи указываются внутри предложения ON JOIN с помощью функции DATEDIFF. Максимальный размер DATEDIFF составляет семь дней. Дополнительные сведения об общем использовании см. в разделе DATEDIFF. При использовании DATEDIFF внутри условия JOIN второй и третий параметр получают специальное лечение.

Кроме того, select * нельзя использовать в инструкциях JOIN.

Синтаксис

[ 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  
  

Аргументы

<input_source>

Указывает источник входных данных.

<reference_data>

Ссылочные данные, к которым вы хотите присоединиться к input_source. Дополнительные сведения см. в разделе "Присоединение к данным ссылки".

<join_type>

Указание типа операции соединения.

СОЕДИНЯТЬ

Указывает, что указанная операция соединения должна выполняться между указанными входными источниками и данными /или ссылочными данными. Все строки из левого и правого собрания условия соединения включены в результирующий набор.

Предупреждение

Если источники JOIN секционированы, предикат JOIN должен включать условие, соответствующее ключам секций обоих источников.

[ ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ ]

Указывает, что все строки из левой таблицы, не соответствующие условиям соединения, включаются в результирующий набор, а выходные столбцы из оставшейся таблицы устанавливаются в значение NULL в дополнение ко всем строкам, возвращаемым внутренним соединением.

ON <join_condition>

Задает условие, на котором основывается соединение. Условие соединения должно иметь временную привязку или темпоральную вихрь, определенную для связи, и указывается внутри предложения ON JOIN, используя специальный синтаксис специальной функции DATEDIFF для функции JOIN.

Примеры

В Azure Stream Analytics все события имеют четко определенную метку времени. Таким образом, пользователь должен использовать псевдонимы строк непосредственно в функции DATEDIFF следующим образом:

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  
  

Приведенное выше условие соединения приведет к совпадению, если и только в том случае, если exitTime возникает после записи, но не более 15 минут спустя.

Замечание

DATEDIFF, используемый в инструкции SELECT, использует общий синтаксис, в котором столбец или выражение даты и времени передается в качестве второго и третьего параметра. Однако при использовании функции DATEDIFF внутри условия JOIN используется имя input_source или его псевдоним. Внутри выбранной метки времени для каждого события в этом источнике.

Условия, связанные с временем, можно сочетать друг с другом и с другими условиями в предложении ON, например:

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  
  

При присоединении трех или более таблиц одинаковые правила применяются --- границы времени должны гарантировать, что все соответствующие события происходят в течение ограниченного времени друг от друга. Например, чтобы найти все ошибки, возникшие между событием начала транзакции и окончания транзакции, можно сказать:

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  
  

При присоединении источников, секционированных, предикат JOIN должен включать условие, соответствующее ключам секций обоих источников.

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 поддерживает внутреннее соединение (по умолчанию) и левое внешнее соединение. Для внутреннего соединения результат возвращается только при обнаружении совпадения. Но для соединения LEFT OUTER, если событие из левой части соединения не совпадает, возвращается строка со значением NULL для всех столбцов правой строки. Например, вот пример для поиска отсутствия событий. Следующий запрос вернет эти строки, в которых автомобиль вошел в платный стенд, но не вышел из Стенда в течение 15 минут.

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  
  

Специальная функция DATEDIFF для JOIN

Синтаксис

DATEDIFF ( datepart , input_source1, input_source2 )  

Аргументы

dateparts

Пример. "second", "миллисекунд", "minute" и т. д.)

input_source1

Первый источник входных данных в соединении. Внутри функции передается метка времени, связанная с событиями из этого input_source.

input_source2

Второй источник входных данных в соединении. Внутри функции передается метка времени, связанная с событиями из этого input_source.

Возвращаемое значение

Возвращает число (в виде целого числа со знаком) указанных границ даты, пересекаемых с метки времени input_source1 до метки времени input_source2. Возвращаемое значение может быть отрицательным, если метка времени input_source1 больше метки времени input_source2.