윈도우 함수중급
LAG / LEAD
윈도우 내 직전/다음 N번째 행의 값을 가져오는 함수
정의
LAG(컬럼, offset, default) OVER (PARTITION BY ... ORDER BY ...)는 ORDER BY 기준 현재 행에서 offset만큼 앞쪽 행의 값을 반환한다. 첫 행에는 앞 행이 없으므로 default(미지정 시 NULL)를 반환한다. LEAD는 반대 방향(다음 행). 시계열 데이터에서 직전 값과의 차이 계산에 표준이다.
왜 중요한가?
서브쿼리나 SELF JOIN으로 "직전 값" 을 가져오던 코드를 한 줄로 대체. 일자별 매출 증감, 직전 로그 시각과의 간격 등 시계열 분석에 필수.
틀리기 쉬운 포인트
- !첫 행/마지막 행은 default가 없으면 NULL을 반환합니다.
- !PARTITION BY를 잊으면 그룹 경계를 넘어 값을 가져옵니다.
- !ORDER BY 컬럼이 정렬되지 않으면 의미 없는 값이 나옵니다.
예시
SELECT order_date, amount, LAG(amount, 1) OVER (ORDER BY order_date) AS prev_amount, amount - LAG(amount, 1) OVER (ORDER BY order_date) AS diff FROM daily_sales;
성능 포인트
!전후 행 접근은 정렬된 윈도우 위에서 O(1)에 가까워 SELF JOIN보다 훨씬 효율적.