JOIN (Análisis de transmisiones de Azure)

Al igual que T-SQL estándar, JOIN en el lenguaje Azure Stream Analytics consulta se usa para combinar registros de dos o más orígenes de entrada. JOIN en Azure Stream Analytics son de naturaleza temporal, lo que significa que cada JOIN debe proporcionar algunos límites en cuanto a la distancia a la que se pueden separar las filas coincidentes en el tiempo. Por ejemplo, es legítimo decir "join TollBoothEntry events with TollBoothExit events when they occur on the same LicensePlate and TollId and within 5 minutes of each other". pero "combinar eventos TollBoothEntry con eventos TollBoothExit cuando se producen en LicensePlate y TollId" no es : coincidiría con cada TollBoothEntry con una colección sin enlazar y potencialmente infinita de todos los TollBoothExit con los mismos LicensePlate y TollId.

Los límites de tiempo para la relación se especifican dentro de la cláusula ON de JOIN, mediante la función DATEDIFF. El tamaño máximo de DATEDIFF es de siete días. Para obtener más información sobre su uso general, vea DATEDIFF (Azure Stream Analytics). Cuando DATEDIFF se utiliza en la condición JOIN, el segundo y tercer parámetro obtienen un tratamiento especial.

Además, SELECT * no se puede usar en instrucciones JOIN.

Sintaxis

[ 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  
  

Argumentos

<input_source>

Especifica el origen de datos de entrada.

<reference_data>

Los datos de referencia al que desea unir mediante JOIN su origen de entrada. Para obtener más información, consulte la sección Combinación de datos de referencia.

<join_type>

Especifica el tipo de operación de combinación.

JOIN

Indica que la operación de combinación especificada debe producirse los orígenes de entrada y/o los datos de referencia especificados. Todas las filas de la izquierda y derecha que cumplan la condición de combinación se incluyen en el conjunto de resultados.

Advertencia

Si los orígenes JOIN tienen particiones, el predicado JOIN debe incluir una condición que coincida con las claves de partición de ambos orígenes.

[ LEFT OUTER JOIN ]

Especifica que todas las filas de la tabla izquierda que no cumplan la condición de combinación se incluyan en el conjunto de resultados, con las columnas de resultados de la otra tabla establecidas en NULL, además de todas las filas devueltas por la combinación interna.

ON <join_condition>

Especifica la condición en la que se basa la combinación. La condición de combinación debe tener un intervalo de tiempo o una sala de subrayado temporal definida para la relación y se especifica dentro de la cláusula ON de JOIN, utilizando la sintaxis especial de función DATEDIFF especial para JOINfunction.

Ejemplos

En Análisis de transmisiones de Azure, todos los eventos tienen una marca de tiempo bien definida. Por lo tanto, el usuario debe usar alias de fila directamente en la función DATEDIFF, como se muestra a continuación:

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  
  

La condición de combinación anterior provocará una coincidencia si y solo si se produce ExitTime después EntryTime, pero no más de 15 minutos más tarde.

Nota:

DATEDIFF usado en la instrucción SELECT usa la sintaxis general donde se pasa una columna o expresión datetime como segundo y tercer parámetro. Sin embargo, cuando se usa la función DATEDIFF dentro de la condición JOIN, se input_source nombre o su alias. Internamente, se selecciona la marca de tiempo asociada a cada evento en ese origen.

Las condiciones de límite temporal se pueden combinar entre sí y con otras condiciones de la cláusula ON, por ejemplo:

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  
  

Al combinar tres o más tablas, se aplican las mismas reglas --- los límites de tiempo deben asegurarse de que todos los eventos coincidentes se producen dentro de una cantidad finita de tiempo entre sí. Por ejemplo, para buscar todos los errores que se produjeron entre el inicio de la transacción y el evento de finalización de la transacción, se puede decir lo siguiente:

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  
  

Cuando se unen orígenes que tienen particiones, el predicado de JOIN debe incluir una condición que coincida con las claves de partición de ambos orígenes.

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  

Por último, Azure Stream Analytics la combinación interna (el valor predeterminado) y la combinación externa IZQUIERDA. Para una combinación interna, solo se devuelve un resultado cuando se encuentra una coincidencia. Pero, en el caso de una combinación LEFT OUTER , si un evento proveniente del lado izquierdo de la combinación no tiene coincidencia, se devolverá una fila con el valor NULL en todas las columnas de la derecha. Por ejemplo, este es un ejemplo para encontrar la ausencia de eventos. La siguiente consulta devolverá las filas donde un vehículo ha entrado en una cabina de peaje pero no ha salido en un período de 15 minutos.

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  
  

Función DATEDIFF especial para JOIN

Sintaxis

DATEDIFF ( datepart , input_source1, input_source2 )  

Argumentos

dateparts

Ejemplo. 'second', 'millisecond', 'minute', etc.)

input_source1

El primer origen de entrada en la combinación. Internamente, la marca de tiempo asociada con los eventos de este valor input_source se pasa a la función.

input_source2

El segundo origen de entrada en la combinación. Internamente, la marca de tiempo asociada con los eventos de este valor input_source se pasa a la función.

Tipo devuelto

Devuelve el número de unidades en los partes de fecha que ha transcurrido de la marca de tiempo de input_source1 a la marca de tiempo de input_source2. El valor devuelto puede ser negativo si la marca de tiempo del segundo input_source es mayor que la primera.