APPLY (Azure Stream Analytics)
El operador APPLY permite invocar una función con valores de tabla para cada fila devuelta por una expresión de tabla externa de una consulta. La función con valores de tabla actúa como la entrada derecha y la expresión de tabla externa como la entrada izquierda. La entrada de la derecha se evalúa para cada fila de la entrada izquierda y las filas producidas se combinan en la salida final. La lista de columnas producidas por el operador APPLY corresponde al conjunto de columnas de la entrada izquierda, seguido de la lista de columnas devueltas por la entrada derecha.
Existen dos formas de APPLY: CROSS APPLY y OUTER APPLY.
CROSS APPLY solo devuelve las filas de la tabla externa que producen un conjunto de resultados de la función con valores de tabla. El resultado de cross APPLY no se puede usar como valor de destino de TIMESTAMP BY. Sin embargo, puede usar un trabajo de Azure Stream Analytics que realice CROSS APPLY y usar un segundo trabajo para realizar TIMESTAMP BY.
OUTER APPLY devuelve tanto las filas que producen un conjunto de resultados como las que no, con valores NULL en la columna producida por la función con valores de tabla.
Hay dos funciones con valores de tabla disponibles en Azure Stream Analytics para facilitar el trabajo con los campos Tipo de matriz y Registro. Son GetArrayElements y GetRecordProperties.
Sintaxis
<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
El nombre o alias del flujo de entrada.
column_name
El nombre de una columna del flujo de entrada.
element_name
Nombre de la nueva columna que contiene el resultado de la función con valores de tabla.
Tipos de valor devuelto
La salida es un registro que contiene la carga inicial y un registro "element_name", que contiene el resultado de la función con valores de tabla.
Para la función GetArrayElements, el resultado será un registro con dos campos:
ArrayIndex: índice del elemento de la matriz
ArrayValue: el valor del elemento de la matriz.
Para la función GetRecordProperties, el resultado será un registro con dos campos:
PropertyName: el nombre de la propiedad en el registro.
PropertyValue: el valor de la propiedad en el registro.
Ejemplos
En este ejemplo, al extender el escenario de peaje, se supone que los automóviles pueden tener más de una placa de licencia (por ejemplo, un coche de remolque tendría dos). CROSS/OUTER APPLY se pueden aplicar para aplanar esta matriz, es decir, obtener una fila por cada número de licencia.
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
La consulta s e puede modificar para usar OUTER APPLY y realizar un seguimiento también de los automóviles sin ningún número de licencia.
SELECT e.TollId, e.EntryTime,
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex
FROM input AS e
OUTER APPLY GetArrayElements(e.Licenses) AS flat
Otro ejemplo del uso de matrices anidadas (matriz de matrices).
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