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