JOIN (Azure Stream Analytics)
標準の 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 (Azure Stream Analytics)」を参照してください。 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>
結合操作の種類を指定します。
JOIN
指定した結合操作が指定した入力ソースの間で、あるいは入力ソースと参照データの間で実行することを示します。 結合条件を満たす左と右のすべての行が結果セットに含まれます。
警告
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 から 15 分以内に ExitTime が発生した場合にのみ一致が発生します。
注意
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 を含む行が返されます。 たとえば、イベントがない場合を見つける例を次に示します。 次のクエリは、Vehicle が Toll Booth に入ったが、15 分では Booth から出なかった行が返されます。
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 のタイムスタンプまでに経過した dateparts の単位数を返します。 2 番目のinput_sourceのタイムスタンプが最初のタイムスタンプより大きい場合、戻り値は負の値になる可能性があります。