APPLY (Azure Stream Analytics)
Оператор APPLY позволяет вызывать функцию с табличным значением для каждой строки, возвращаемой внешним табличным выражением запроса. Функция с табличным значением выступает в роли правого входа, а внешнее табличное выражение — в роли левого входа. Входные данные справа оцениваются для каждой строки из входных данных слева, а затем результат объединяется в итоговых выходных данных. Список столбцов, созданных оператором APPLY, является набором столбцов в левом входе, за которым следует список столбцов, возвращенный правым входом.
Существует две формы ПРИМЕНЕНИЯ: CROSS APPLY и OUTER APPLY.
Оператор CROSS APPLY возвращает только строки из внешней таблицы, которые создает результирующий набор из функции с табличным значением. Результат CROSS APPLY не может использоваться в качестве целевого значения TIMESTAMP BY. Однако можно использовать одно задание Azure Stream Analytics, которое выполняет CROSS APPLY, и второе задание для выполнения TIMESTAMP BY.
Оператор OUTER APPLY возвращает и строки, которые формируют результирующий набор, и строки, которые этого не делают, со значениями NULL в столбцах, созданных функцией с табличным значением.
В Azure Stream Analytics доступны две функции с табличным значением, упрощающие работу с полями массива и типа записи. Это GetArrayElements и GetRecordProperties.
Синтаксис
<input> {CROSS | OUTER} APPLY <elements_selector>
<input> ::= input_name | input_alias
<elements_selector> ::=
{GetArrayElements | GetRecordProperties} (<column_name>) AS element_name
Аргументы
input_name | input_alias
Имя или псевдоним входного потока.
column_name
Имя столбца входного потока.
element_name
Имя нового столбца, содержащего результат функции с табличным значением.
Типы возвращаемых данных
Выходные данные — это запись, содержащая начальные полезные данные, и запись "element_name", которая содержит результат функции с табличным значением.
Для функции GetArrayElements результатом будет запись с двумя полями:
ArrayIndex: индекс элемента в массиве.
ArrayValue: значение элемента в массиве.
Для функции GetRecordProperties результатом будет запись с двумя полями:
PropertyName: имя свойства в записи.
PropertyValue: значение свойства в записи.
Примеры
В этом примере, расширяя сценарий платных автомобилей, мы предполагаем, что автомобили могут иметь более одного номерного знака (например, автомобиль, буксирующий прицеп, будет иметь два). Оператор CROSS/OUTER APPLY позволяет свести этот массив, т. е. получить одну строку для каждого номерного знака.
CREATE TABLE input(TollId nvarchar(max), EntryTime datetime, Licenses array)
SELECT e.TollId, e.EntryTime, flat.ArrayValue AS licensePlate
FROM input AS e
CROSS APPLY GetArrayElements(e.Licenses) AS flat
Запрос можно изменить для использования оператора OUTER APPLY, чтобы также отслеживать автомобили вообще без номерного знака.
SELECT e.TollId, e.EntryTime,
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex
FROM input AS e
OUTER APPLY GetArrayElements(e.Licenses) AS flat
Еще один пример использования вложенных массивов (массив массивов).
WITH firstQuery AS (
SELECT input.TollId, input.EntryTime,
flat.ArrayIndex AS i1, flat.ArrayValue AS licenses
FROM input
CROSS APPLY GetArrayElements(input.ArrayOfArray) AS flat)
SELECT firstQuery.TollId, firstQuery.EntryTime, firstQuery.i1,
flat2.ArrayIndex AS i2, flat2.ArrayValue AS license
FROM firstQuery
CROSS APPLY GetArrayElements(firstQuery.licenses) AS flat2