JOIN(Azure 스트림 분석)

표준 T-SQL과 마찬가지로 Azure Stream Analytics 쿼리 언어의 JOIN은 둘 이상의 입력 원본의 레코드를 결합하는 데 사용됩니다. Azure Stream Analytics의 JOIN은 본질적으로 임시적입니다. 즉, 각 JOIN은 일치하는 행을 시간 단위로 구분할 수 있는 정도에 대한 몇 가지 제한을 제공해야 합니다. instance 경우 "동일한 LicensePlate 및 TollId에서 발생할 때 TollBoothExit 이벤트와 함께 TollBoothEntry 이벤트에 참가하고 서로 5분 이내에 참가"하는 것은 합법적입니다. 그러나 "LicensePlate 및 TollId에서 발생할 때 TollBoothExit 이벤트와 TollBoothEntry 이벤트 조인"은 아닙니다. 각 TollBoothEntry와 모든 TollBoothExit의 무제한 무한 컬렉션과 동일한 LicensePlate 및 TollId와 일치합니다.

관계에 대한 시간 범위는 DATEDIFF 함수를 사용하여 JOIN의 ON 절 내에 지정됩니다. 최대 DATEDIFF 크기는 7일입니다. 일반적인 사용에 대한 자세한 내용은 DATEDIFF(Azure Stream Analytics)를 참조하세요. DATEDIFF가 JOIN 조건 내에 사용된 경우 두 번째 및 세 번째 매개 변수가 특별하게 처리됩니다.

또한 SELECT *는 JOIN 문에서 사용할 수 없습니다.

Syntax

[ 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 스트림 분석에서 모든 이벤트에는 올바르게 정의된 타임스탬프가 있습니다. 따라서 사용자는 다음과 같이 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  
  

위의 조인 조건은 ExitTime이 EntryTime 후 15분 이내에 발생하는 경우에만 일치합니다.

참고

SELECT 문에 사용되는 DATEDIFF는 datetime 열 또는 식이 두 번째 및 세 번째 매개 변수로 전달되는 일반 구문을 사용합니다. 그러나 DATEDIFF 함수가 JOIN 조건 내에서 사용되는 경우 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  
  

세 개 이상의 테이블을 조인할 때 동일한 규칙이 적용됩니다--- 시간 범위는 일치하는 모든 이벤트가 서로 유한한 시간 내에 발생하도록 해야 합니다. instance 트랜잭션 시작 이벤트와 트랜잭션 종료 이벤트 간에 발생한 모든 오류를 찾으려면 다음을 말할 수 있습니다.

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이 있는 행이 반환됩니다. instance 이벤트의 부재를 찾는 예제는 다음과 같습니다. 다음 쿼리는 차량이 요금소에 진입한 후 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 함수

Syntax

DATEDIFF ( datepart , input_source1, input_source2 )  

인수

dateparts

예: 'second', 'millisecond', 'minute' 등)

input_source1

조인의 첫 번째 입력 원본입니다. 내부적으로 이 input_source의 이벤트와 연결된 타임스탬프는 함수로 전달됩니다.

input_source2

조인의 두 번째 입력 원본입니다. 내부적으로 이 input_source의 이벤트와 연결된 타임스탬프는 함수로 전달됩니다.

반환 형식

input_source1 타임스탬프에서 input_source2 타임스탬프 사이에 경과한 datepart의 단위 수를 반환합니다. 두 번째 input_source 타임스탬프가 첫 번째 타임스탬프보다 큰 경우 반환된 값은 음수일 수 있습니다.