Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
✅ Поток событий 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.