Post

Advanced SQL: LAG and LEAD

Advanced SQL: LAG and LEAD

Description

LAG()LEAD()는 윈도우 함수로, 현재 행을 기준으로 이전 값과 다음 값을 가져올 때 사용한다. 행을 줄이지 않고 원본을 유지한 채 비교 값을 붙여서 볼 수 있어 시계열 분석에 자주 쓰인다.

LAG()는 이전 행 값을, LEAD()는 다음 행 값을 반환한다. 필요하면 몇 행 전후를 볼지(offset)와 값이 없을 때 대체할 값(default)도 지정할 수 있다.

Syntax

OVER() 안에서 계산 기준을 정한다. ORDER BY는 이전/다음의 기준 순서를 만들고, PARTITION BY를 쓰면 그룹별로 나눠 계산한다.

SELECT column_name,
       LAG(target_column, offset, default_value)
           OVER (PARTITION BY group_column ORDER BY order_column) AS prev_value,
       LEAD(target_column, offset, default_value)
           OVER (PARTITION BY group_column ORDER BY order_column) AS next_value
FROM table_name;

Example

LAG: Previous Value

주문 날짜 기준으로 이전 주문 금액을 함께 조회한다.

SELECT order_date,
       amount,
       LAG(amount) OVER (ORDER BY order_date) AS prev_amount
FROM orders;

LEAD: Next Value

주문 날짜 기준으로 다음 주문 금액을 함께 조회한다.

SELECT order_date,
       amount,
       LEAD(amount) OVER (ORDER BY order_date) AS next_amount
FROM orders;

Difference from Previous Row

현재 금액과 이전 금액의 차이를 계산한다.

SELECT order_date,
       amount,
       amount - LAG(amount) OVER (ORDER BY order_date) AS diff_from_prev
FROM orders;

Grouped LAG and LEAD

고객별 주문 흐름에서 이전/다음 주문 금액을 조회한다.

SELECT customer_id,
       order_date,
       amount,
       LAG(amount)  OVER (PARTITION BY customer_id ORDER BY order_date) AS prev_amount,
       LEAD(amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS next_amount
FROM orders;

Reference

This post is licensed under CC BY 4.0 by the author.

Trending Tags