JOIN (Azure Stream Analytics)

Assim como o T-SQL padrão, o JOIN na linguagem de consulta do Azure Stream Analytics é usado para combinar registros de duas ou mais fontes de entrada. O JOIN no Azure Stream Analytics é temporal por natureza, o que significa que cada JOIN deve fornecer alguns limites sobre até que ponto as linhas correspondentes podem ser separadas a tempo. Por exemplo, dizer "ingressar em eventos TollBoothEntry com eventos TollBoothExit quando eles ocorrem no mesmo LicensePlate e TollId e dentro de 5 minutos um do outro" é legítimo; mas "unir eventos TollBoothEntry com eventos TollBoothExit quando eles ocorrem no LicensePlate e TollId" não é – corresponderia a cada TollBoothEntry com uma coleção não associada e potencialmente infinita de todos os TollBoothExit com a mesma LicensePlate e TollId.

Os limites de tempo para a relação são especificados dentro da cláusula ON do JOIN, usando a função DATEDIFF. O tamanho máximo de DATEDIFF é de sete dias. Para obter mais informações sobre seu uso geral, consulte DATEDIFF (Azure Stream Analytics). Quando DATEDIFF é usado na condição JOIN, o segundo e o terceiro parâmetros obtêm tratamento especial.

Além disso, SELECT * não pode ser usado em instruções JOIN.

Sintaxe

[ 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 a fonte de dados de entrada.

<reference_data>

Os dados de referência para os quais você deseja ingressar a sua input_source. Para obter mais informações, consulte a seção JOIN dos dados de referência.

<join_type>

Especifica o tipo de operação de junção.

JOIN

Indica que a operação de junção especificada deve acontecer entre as fontes de entrada especificados e/ou dados de referência. Todas as linhas da esquerda e da direita que atendem à condição de junção estão incluídas no conjunto de resultados.

Aviso

Se as fontes JOIN forem particionadas, o predicado JOIN deverá incluir uma condição que corresponda às chaves de partição de ambas as fontes.

[ LEFT OUTER JOIN ]

Especifica que todas as linhas da tabela esquerda que não atendem à condição de junção sejam incluídas no conjunto de resultados, e as colunas de saída da outra tabela sejam definidas como NULL além de todas as linhas retornadas pela junção interna.

ON <join_condition>

Especifica o critério no qual a junção se baseia. A condição de junção deve ter um limite de tempo ou uma sala de agitação temporal definida para a relação e é especificada dentro da cláusula ON do JOIN, usando a sintaxe especial da função SPECIAL DATEDIFF paraa função JOIN.

Exemplos

No Azure Stream Analytics, todos os eventos possuem um carimbo de data e hora bem definido. Portanto, o usuário deve usar aliases de linha diretamente na função DATEDIFF, da seguinte maneira:

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  
  

A condição de junção acima resultará em uma correspondência somente se a ExitTime ocorrer após a EntryTime, mas não mais do que 15 minutos mais tarde.

Observação

DATEDIFF usado na instrução SELECT usa a sintaxe geral em que uma coluna ou expressão datetime é passada como o segundo e o terceiro parâmetro. No entanto, quando a função DATEDIFF é usada dentro da condição JOIN, o nome input_source ou seu alias é usado. Internamente, o carimbo de data/hora associado a cada evento nesta origem é escolhido.

As condições de limite de tempo podem ser combinadas entre si e com outras condições dentro da cláusula ON, por exemplo:

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  
  

Ao ingressar três ou mais tabelas, as mesmas regras se aplicam --- limites de tempo devem garantir que todos os eventos correspondentes ocorram dentro de um período finito de tempo um do outro. Por exemplo, para localizar todos os erros ocorridos entre o evento de início da transação e de término da transação, pode-se dizer:

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  
  

Ao unir fontes particionadas, o predicado JOIN deve incluir uma condição que corresponda às chaves de partição de ambas as fontes.

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 fim, o Azure Stream Analytics dá suporte à junção interna (o padrão) e à junção externa LEFT. Para uma junção interna, um resultado é retornado somente quando uma correspondência é encontrada. Mas para uma junção LEFT OUTER , se um evento do lado esquerdo da junção for incomparável, uma linha com NULL para todas as colunas da linha à direita será retornada. Por exemplo, aqui está um exemplo para encontrar a ausência de eventos. A consulta a seguir retornará as linhas onde um veículo entrou em uma cabine de pedágio, mas não saiu de lá dentro 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  
  

Função DATEDIFF especial para JOIN

Sintaxe

DATEDIFF ( datepart , input_source1, input_source2 )  

Argumentos

Dateparts

Exemplo. 'second', 'milissegundo', 'minute', etc.)

input_source1

A primeira fonte de entrada na junção. Internamente, o carimbo de data/hora associado aos eventos dessa input_source é passado para a função.

input_source2

A segunda fonte de entrada na junção. Internamente, o carimbo de data/hora associado aos eventos dessa input_source é passado para a função.

Tipo de retorno

Retorna o número de unidades na dateparts que decorreram desde o carimbo de data/hora de input_source1 até o carimbo de data/hora de input_source2. O valor retornado poderá ser negativo se o carimbo de data/hora do segundo input_source for maior que o primeiro.