다음을 통해 공유


LAG(Azure 스트림 분석)

LAG 분석 연산자를 사용하면 특정 제약 조건 내에서 이벤트 스트림에서 "이전" 이벤트를 조회할 수 있습니다. 변수 증가율을 계산하거나, 변수가 임계값을 초과하는 경우 또는 조건이 true로 시작되거나 중지되는 시기를 감지하는 데 매우 유용합니다.

Stream Analytics에서 LAG의 scope(즉, 현재 이벤트와 기록에서 얼마나 멀리 떨어져 있는지)는 항상 LIMIT DURATION 절을 사용하여 유한한 시간 간격으로 제한됩니다. 선택적으로 LAG는 PARTITION BY 및 WHEN 절을 사용하여 특정 속성 또는 조건에서 현재 이벤트와 일치하는 이벤트만 고려하도록 제한할 수 있습니다.

LAG는 WHERE 절의 조건자, JOIN 절의 조인 조건 또는 해당 절보다 평가되기 때문에 현재 쿼리의 GROUP BY 절에 있는 그룹화 식의 영향을 받지 않습니다.

Syntax

LAG(<scalar_expression >, [<offset >], [<default>])  
     OVER ([PARTITION BY <partition key>] LIMIT DURATION(<unit>, <length>) [WHEN boolean_expression])
  

예를 들면 다음과 같습니다.

LAG(reading) OVER (LIMIT DURATION(hour, 3))  
LAG(name, 2, 'none such') OVER (PARTITION BY userId LIMIT DURATION(minute, 2))  

인수

scalar_expression

지정한 오프셋에 따라 반환할 값입니다. 단일(스칼라) 값 또는 와일드카드 식 ‘*’를 반환하는 모든 유형의 식입니다. '*'의 경우 지정된 오프셋에 따른 전체 이벤트가 반환되고 결과 이벤트(중첩된 레코드)에 포함됩니다.
scalar_expression 은 다른 분석 함수 또는 외부 함수를 포함할 수 없습니다.

offset

현재 이벤트에서 값을 얻어 오기 위해 뒤로 거슬러 올라가는 이벤트의 개수입니다. 지정하지 않으면 기본값은 1입니다. 즉, 이전 이벤트를 반환합니다. 오프셋은 1보다 크거나 같은 정수여야 합니다. 이벤트는 임시 순서 대로 처리됩니다. 동일한 타임스탬프가 있는 이벤트가 여러 개인 경우 이벤트는 도착하는 순서대로 처리됩니다.

default

지정된 오프셋에 이벤트가 없는 경우 반환되는 값입니다. 기본값이 지정되어 있지 않으면 NULL이 반환됩니다. '지정된 오프셋에 이벤트가 없습니다.'는 경우 1) 지금까지 표시된 해당 이벤트의 수가 지정된 오프셋보다 작으면 2) 지정된 오프셋의 이벤트가 지정된 limit_duration_clause 3) 이벤트가 존재하지만 when_clause 지정된 부울 조건과 일치하지 않는 경우 2일 수 있습니다.

지정된 오프셋의 이벤트가 있고 scalar_expression 값이 NULL인 경우 NULL
가 반환됩니다. default는 열, 하위 쿼리 또는 기타 식일 수 있지만 다른 식은 포함할 수 없습니다.
분석 함수 또는 외부 함수. 기본값은 과 정확히 동일한 형식이어야 합니다.
scalar_expression.

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause PARTITION BY <파티션 키> 절은 값이 인 이벤트만 요청합니다.
<파티션 키> 는 고려되는 현재 이벤트의 키와 동일합니다. 예를 들어

LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))  

는 현재 이벤트와 동일한 센서의 이전 판독값을 반환합니다(이전 1시간 이내에 발생한 경우).

limit_duration 절 DURATION(<unit>, <length>)

현재 이벤트의 기록을 고려해야 하는 정도를 지정합니다. 지원되는 단위와 해당 약어에 대한 자세한 설명은 DATEDIFF를 참조하세요. DURATION 간격 <내에 일치하는 이벤트가 충분하지 않으면 기본> 값이 반환됩니다.

when_clause
LAG 계산에서 고려할 이벤트에 대한 부울 조건을 지정합니다. DURATION 간격 <내에 일치하는 이벤트가 충분하지 않으면 기본> 값이 반환됩니다. when_clause 선택 사항입니다.

반환 형식

지정된 scalar_expression의 데이터 형식입니다. NULL이 반환됩니다(scalar_expression).

일반적인 주의 사항

LAG는 비결정적입니다. 이벤트는 임시 순서 대로 처리됩니다. 동일한 타임스탬프가 있는 이벤트가 여러 개인 경우 이벤트는 도착하는 순서대로 처리됩니다.

창 함수의 결과 집합에 LAG를 적용하면 예기치 않은 결과가 발생할 수 있습니다. 창 함수는 모든 창 작업이 창 끝에 이벤트를 출력하므로 이벤트의 타임스탬프를 변경합니다. 이벤트의 현재 타임스탬프는 system.timestamp()를 사용하여 액세스할 수 있습니다. 창 작업 후에는 원래 이벤트 시간 특성과 다릅니다. 창 작업 전에 LAG를 이동할 수 없는 경우 CollectTop을 사용하여 원래 이벤트 시간으로 순서를 지정하는 것이 좋습니다.

예제

센서당 증가율을 계산합니다.

SELECT sensorId,  
       growth = reading -
                        LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))  
FROM input  
  

이전 null이 아닌 센서 읽기를 찾습니다.

SELECT  
     sensorId,  
     LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading IS NOT NULL)  
     FROM input  
  

특정 센서 유형에 대한 이전 null이 아닌 센서 판독값을 찾습니다.

WITH filterSensor AS
(
  SELECT *
  FROM input
  WHERE input.sensorType = 4 AND sensorId IS NOT NULL
)

SELECT
  LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))
FROM filterSensor

변수가 임계값을 초과하는 시기를 결정합니다.

SELECT
    sensorId, reading
FROM input
WHERE
    devicetype = 'thermostat'
    AND reading > 100
    AND LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN devicetype = 'thermostat') <= 100

참고 항목

ISFIRST(Azure 스트림 분석)
LAST(Azure Stream Analytics)