Partilhar via


JOIN (Azure Stream Analytics)

Tal como o T-SQL padrão, a função JOIN na linguagem de consulta do Azure Stream Analytics é utilizada para combinar registos de duas ou mais origens de entrada. A associação ao Azure Stream Analytics é de natureza temporal, o que significa que cada JOIN tem de fornecer alguns limites sobre até que ponto as linhas correspondentes podem ser separadas a tempo. Por exemplo, dizer "associar eventos TollBoothEntry com eventos TollBoothExit quando ocorrem no mesmo LicensePlate e TollId e no prazo de 5 minutos entre si" é legítimo; mas "participar em eventos TollBoothEntry com eventos TollBoothExit quando ocorrem no LicensePlate e TollId" não é – corresponderia a cada TollBoothEntry com uma coleção infinita e não vinculada de todas as TollBoothExit ao mesmo LicensePlate e TollId.

Os limites de tempo da relação são especificados dentro da cláusula ON da função JOIN, utilizando a função DATEDIFF. O tamanho máximo de DATEDIFF é de sete dias. Para obter mais informações sobre a utilização geral, veja DATEDIFF (Azure Stream Analytics). Quando DATEDIFF é utilizado dentro da condição JOIN, o segundo e terceiro parâmetros ganham tratamento especial.

Além disso, SELECT * não pode ser utilizado 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 origem de dados de entrada.

<reference_data>

Os dados de referência aos quais pretende Associar a sua input_source. Para obter mais informações, veja a secção Associação a Dados de Referência.

<join_type>

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

PARTICIPAR

Indica que a operação de associação especificada deve ocorrer entre as origens de entrada especificadas e /ou os dados de referência. Todas as linhas da esquerda e da direita que cumprem a condição de associação estão incluídas no conjunto de resultados.

Aviso

Se as origens JOIN estiverem particionadas, o predicado JOIN tem de incluir uma condição que corresponda às chaves de partição de ambas as origens.

[ ASSOCIAÇÃO EXTERNA À ESQUERDA ]

Especifica que todas as linhas da tabela esquerda que não cumprem a condição de associação estão incluídas no conjunto de resultados e as colunas de saída da outra tabela estão definidas como NULL, além de todas as linhas devolvidas pela associação interna.

ON <join_condition>

Especifica a condição em que a associação se baseia. A condição de associação tem de ter um limite de tempo ou uma sala de manobra temporal definida para a relação e é especificada dentro da cláusula ON da função JOIN, utilizando a sintaxe especial da Função DATEDIFF Especial para afunção JOIN.

Exemplos

No Azure Stream Analytics, todos os eventos têm um carimbo de data/hora bem definido. Assim, o utilizador tem de utilizar aliases de linha diretamente na função DATEDIFF, da seguinte forma:

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 associação acima resultará numa correspondência se e apenas se o ExitTime ocorrer após o EntryTime, mas não mais de 15 minutos depois.

Nota

DATEDIFF utilizado na instrução SELECT utiliza a sintaxe geral em que uma coluna ou expressão datetime é transmitida como o segundo e terceiro parâmetros. No entanto, quando a função DATEDIFF é utilizada dentro da condição JOIN, é utilizado o nome do input_source ou o respetivo alias. Internamente, o carimbo de data/hora associado a cada evento nessa origem é escolhido.

As condições vinculadas ao 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 associar três ou mais tabelas, as mesmas regras aplicam-se --- limites de tempo têm de garantir que todos os eventos correspondentes ocorrem dentro de um período de tempo finito entre si. Por exemplo, para encontrar todos os erros ocorridos entre o início da transação e o evento de fim 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 associar origens particionadas, o predicado JOIN tem de incluir uma condição que corresponda às chaves de partição de ambas as origens.

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 suporta a associação interna (a predefinição) e a associação externa LEFT. Para uma associação interna, só é apresentado um resultado quando é encontrada uma correspondência. Mas numa associação EXTERNA, se um evento externo à associação não tiver qualquer correspondência, é apresentada a linha NULO para todas as colunas da linha à direita. Por exemplo, eis um exemplo para encontrar a ausência de eventos. A seguinte consulta devolverá as linhas em que um Veículo entrou numa Portagem, mas não saiu do Booth no prazo 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

partes de data

Exemplo. "segundo", "milissegundos", "minuto", etc.)

input_source1

A primeira origem de entrada na Associação. Internamente, o carimbo de data/hora associado aos eventos deste input_source é transmitido para a função.

input_source2

A segunda origem de entrada na Associação. Internamente, o carimbo de data/hora associado aos eventos deste input_source é transmitido para a função.

Tipo de Devolução

Devolve o número de unidades em partes de data que decorrido do carimbo de data/hora de input_source1 ao carimbo de data/hora de input_source2. O valor devolvido pode ser negativo se o carimbo de data/hora do segundo input_source for superior ao primeiro.