APLICAR (Azure Stream Analytics)
O operador APPLY permite-lhe invocar uma função com valor de tabela para cada linha devolvida por uma expressão de tabela externa de uma consulta. A função com valor de tabela funciona como a entrada direita e a expressão da tabela externa funciona como a entrada esquerda. A entrada à direita é avaliada para cada linha da entrada esquerda e as linhas produzidas são combinadas para o resultado final. A lista de colunas produzidas pelo operador APPLY é o conjunto de colunas na entrada esquerda seguida da lista de colunas devolvidas pela entrada direita.
Existem duas formas de APLICAR: APLICAR CRUZADA E APLICAR EXTERNAMENTE.
CROSS APPLY devolve apenas linhas da tabela externa que produzem um conjunto de resultados da função com valor de tabela. O resultado de uma Aplicação CRUZADA não pode ser utilizado como o valor de destino do CARIMBO DE DATA/HORA POR. No entanto, pode utilizar uma tarefa do Azure Stream Analytics que executa a função CROSS APPLY e utilizar uma segunda tarefa para executar o TIMESTAMP BY.
OUTER APPLY devolve ambas as linhas que produzem um conjunto de resultados e linhas que não produzem, com valores NULL nas colunas produzidas pela função com valor de tabela.
Existem duas funções com valor de tabela disponíveis no Azure Stream Analytics para facilitar o trabalho com os campos Tipo de matriz e registo. São GetArrayElements e GetRecordProperties.
Sintaxe
<input> {CROSS | OUTER} APPLY <elements_selector>
<input> ::= input_name | input_alias
<elements_selector> ::=
{GetArrayElements | GetRecordProperties} (<column_name>) AS element_name
Argumentos
input_name | input_alias
O nome ou alias do fluxo de entrada.
column_name
O nome de uma coluna do fluxo de entrada.
element_name
O nome da nova coluna que contém o resultado da função com valor de tabela.
Tipos de Devolução
O resultado é um registo que contém o payload inicial e um registo "element_name", que contém o resultado da função com valor de tabela.
Para a função GetArrayElements, o resultado será um registo com dois campos:
ArrayIndex: o índice do elemento na matriz
ArrayValue: o valor do elemento na matriz.
Para a função GetRecordProperties, o resultado será um registo com dois campos:
PropertyName: o nome da propriedade no registo.
PropertyValue: o valor da propriedade no registo.
Exemplos
Neste exemplo, alargando o cenário de portagem, partimos do princípio de que os automóveis podem ter mais do que uma matrícula (por exemplo, um automóvel a rebocar um reboque teria dois). A aplicação cruzada/externa pode ser utilizada para aplanar esta matriz, ou seja, obter uma linha por placa.
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
A consulta pode ser modificada para utilizar a aplicação externa para manter também o registo de automóveis sem matrícula.
SELECT e.TollId, e.EntryTime,
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex
FROM input AS e
OUTER APPLY GetArrayElements(e.Licenses) AS flat
Outro exemplo com matrizes aninhadas (matriz de matrizes).
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