Partilhar via


ADERIR

✅ Azure Stream Analytics ✅ Fabric Eventstream

Como o T-SQL padrão, JOIN na linguagem de consulta do Azure Stream Analytics é usado para combinar registros de duas ou mais fontes de entrada. JOIN no Azure Stream Analytics é de natureza temporal, o que significa que cada JOIN deve fornecer alguns limites sobre até onde as linhas correspondentes podem ser separadas no tempo. Por exemplo, dizer "participe de eventos TollBoothEntry com eventos TollBoothExit quando eles ocorrerem na mesma LicensePlate e TollId e dentro de 5 minutos um do outro" é legítimo; mas "participar de eventos TollBoothEntry com eventos TollBoothExit quando eles ocorrem na LicensePlate e TollId" não é – isso corresponderia a cada TollBoothEntry com uma coleção ilimitada e potencialmente infinita de todos os TollBoothExit para 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 do DATEDIFF é de sete dias. Para obter mais informações sobre seu uso geral, consulte DATEDIFF. Quando DATEDIFF é usado dentro da condição JOIN, o segundo e terceiro parâmetros ganham 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 aos quais pretende aderir à sua input_source. Para obter mais informações, consulte a seção Junção de dados de referência.

<join_type>

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

ADERIR

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

Advertência

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

[ JUNÇÃO EXTERIOR ESQUERDA ]

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

EM <join_condition>

Especifica a condição na qual a junção se baseia. A condição de junção deve ter um limite de tempo ou uma sala de oscilação temporal definida para a relação e é especificada dentro da cláusula ON da função JOIN, usando a sintaxe especial de Special DATEDIFF Function for JOINfunction.

Exemplos

No Azure Stream Analytics, todos os eventos têm um carimbo de data/hora bem definido. Assim, 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 se e somente se o ExitTime ocorrer após o EntryTime, mas não mais de 15 minutos depois.

Observação

DATEDIFF usado na instrução SELECT usa a sintaxe geral onde uma coluna ou expressão datetime é passada como o segundo e 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 nessa fonte é selecionado.

As condições limitadas no 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 unir três ou mais tabelas, as mesmas regras se aplicam --- os limites de tempo devem garantir que todos os eventos correspondentes ocorram dentro de um período de tempo finito uns dos outros. Por exemplo, para encontrar todos os erros que ocorreram entre o início e o evento final 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 correspondente à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 à associação interna (padrão) e à associação externa ESQUERDA. Para uma junção interna, um resultado só é retornado quando uma correspondência é encontrada. Mas para uma junção OUTER ESQUERDA, 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 em que um veículo entrou em uma cabine de pedágio, mas não saiu da cabine em 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 especial DATEDIFF para JOIN

Sintaxe

DATEDIFF ( datepart , input_source1, input_source2 )  

Argumentos

dateparts

Exemplo. «segundo», «milissegundo», «minuto», etc.)

input_source1

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

input_source2

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

Valor de retorno

Retorna a contagem (como um inteiro assinado) dos limites de parte de data especificados cruzados do carimbo de data/hora de input_source1 para o carimbo de data/hora de input_source2. O valor retornado pode ser negativo se o carimbo de data/hora de input_source1 for maior que o carimbo de data/hora de input_source2.