次の方法で共有


参加する

✅ Azure Stream Analytics ✅ Fabric Eventstream

標準の T-SQL と同様に、Azure Stream Analytics クエリ言語の JOIN は、2 つ以上の入力ソースのレコードを結合するために使用されます。 Azure Stream Analytics の JOIN は本質的に一時的なものです。つまり、各 JOIN では、一致する行を時間内に区切る方法に関するいくつかの制限を提供する必要があります。 たとえば、"同じ LicensePlate と TollId で発生し、互いに 5 分以内に TollBoothExit イベントを含む TollBoothEntry イベントに参加する" という言い方は正当です。ただし、"LicensePlate と TollId で発生したときに TollBoothExit イベントと TollBoothEntry イベントを結合する" は行われません。これは、すべての TollBoothExit の無制限かつ無限のコレクションを持つ各 TollBoothEntry と同じ LicensePlate と TollId に一致します。

リレーションシップの時間境界は、DATEDIFF 関数を使用して、JOIN の ON 句内で指定されます。 DATEDIFF の最大サイズは 7 日間です。 一般的な使用方法の詳細については、 DATEDIFF を参照してください。 DATEDIFF を JOIN 条件内で使用すると、2 番目と 3 番目のパラメーターは特別な処理を受けます。

また、SELECT * は JOIN ステートメントでは使用できません。

構文

[ 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  
  

論争

<input_source>

入力データ ソースを指定します。

<reference_data>

input_sourceに参加させる参照データ。 詳細については、「参照データ結合」セクションを参照してください。

<join_type>

結合操作の種類を指定します。

接続

指定した入力ソースと参照データの間で、指定した結合操作を実行する必要があることを示します。 結合条件を満たす左右のすべての行が結果セットに含まれます。

Warnung

JOIN ソースがパーティション分割されている場合、JOIN 述語には、両方のソースのパーティション キーと一致する条件が含まれている必要があります。

[ LEFT OUTER JOIN ]

内部結合によって返されるすべての行に加えて、結合条件に合わない左側のテーブルのすべての行も結果セットに含まれます。右側のテーブルからの出力列は NULL に設定されることを指定します。

ON <join_condition>

結合するときの条件を指定します。 結合条件には、リレーションシップに対して時間バインドまたはテンポラル ウィグル ルームが定義されている必要があり、JOIN 関数の Special DATEDIFF 関数の特殊な構文を使用して、JOIN の ON 句内で指定されます。

例示

Azure Stream Analytics では、すべてのイベントに明確に定義されたタイムスタンプがあります。 したがって、ユーザーは次のように DATEDIFF 関数で行エイリアスを直接使用する必要があります。

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  
  

上記の結合条件は、EntryTime の後に ExitTime が発生した場合にのみ一致しますが、15 分以内です。

SELECT ステートメントで使用される DATEDIFF は、datetime 列または式が 2 番目と 3 番目のパラメーターとして渡される一般的な構文を使用します。 ただし、JOIN 条件内で DATEDIFF 関数を使用する場合は、input_source名またはそのエイリアスが使用されます。 内部的には、そのソース内の各イベントに関連付けられているタイムスタンプが選択されます。

時間バインド条件は、互いに組み合わせて、ON 句内の他の条件と組み合わせることができます。例:

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  
  

3 つ以上のテーブルを結合する場合、同じ規則が適用---、一致するすべてのイベントが互いに有限の時間内に発生することを確認する必要があります。 たとえば、トランザクションの開始イベントとトランザクション終了イベントの間に発生したすべてのエラーを見つけるには、次のように指定できます。

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  
  

パーティション分割されたソースを結合する場合、JOIN 述語には、両方のソースのパーティション キーと一致する条件を含める必要があります。

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  

最後に、Azure Stream Analytics では、内部結合 (既定) と LEFT 外部結合の両方がサポートされます。 内部結合の場合、結果は一致が見つかった場合にのみ返されます。 ただし、LEFT OUTER 結合の場合、結合の左側からのイベントが一致しない場合は、右側の行のすべての列に対して NULL を持つ行が返されます。 たとえば、イベントがない場合を見つける例を次に示します。 次のクエリでは、車両が有料ブースに入ったが、15 分以内にブースを終了していない行が返されます。

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  
  

JOIN の特別な DATEDIFF 関数

構文

DATEDIFF ( datepart , input_source1, input_source2 )  

論争

dateparts

例。 'second'、'millisecond'、'minute'など)

input_source1

結合の最初の入力ソース。 内部的には、このinput_sourceのイベントに関連付けられたタイムスタンプが関数に渡されます。

input_source2

結合の 2 番目の入力ソース。 内部的には、このinput_sourceのイベントに関連付けられたタイムスタンプが関数に渡されます。

返り値の種類

input_source1のタイムスタンプからinput_source2のタイムスタンプまで経過した datepart の単位数を返します。 2 番目のinput_sourceのタイムスタンプが最初のinput_sourceより大きい場合、戻り値は負の値になる可能性があります。