
| 함수 | 의미 |
|---|---|
| LAG | 이전 행 값 가져오기 |
| LEAD | 다음 행 값 가져오기 |
LAG(컬럼) OVER(ORDER BY 정렬기준) -- 이전 행
LEAD(컬럼) OVER(ORDER BY 정렬기준) -- 다음 행
윈도우 함수니까 () OVER() 필수!
| sale_date | amount |
|---|---|
| 2024-06-01 | 100000 |
| 2024-06-02 | 120000 |
| 2024-06-03 | 90000 |
SELECT
sale_date,
amount,
LAG(amount) OVER(ORDER BY sale_date) AS prev_amount,
LEAD(amount) OVER(ORDER BY sale_date) AS next_amount
FROM daily_sales
| sale_date | amount | prev_amount | next_amount |
|---|---|---|---|
| 2024-06-01 | 100000 | NULL | 120000 |
| 2024-06-02 | 120000 | 100000 | 90000 |
| 2024-06-03 | 90000 | 120000 | NULL |
첫 행의 LAG = NULL, 마지막 행의 LEAD = NULL
SELECT
stock_date,
price,
LAG(price) OVER(ORDER BY stock_date) AS prev_price,
price - LAG(price) OVER(ORDER BY stock_date) AS price_change
FROM stock_prices
| stock_date | price | prev_price | price_change |
|---|---|---|---|
| 2024-07-01 | 50000 | NULL | NULL |
| 2024-07-02 | 52000 | 50000 | 2000 |
| 2024-07-03 | 48000 | 52000 | -4000 |
-- 둘 다 같은 결과!
price - LAG(price) OVER(ORDER BY stock_date)
price - (LAG(price) OVER(ORDER BY stock_date))
복잡한 계산이면 괄호 치는 게 가독성 좋음!
-- ❌ 틀림!
SELECT LAG(amount) OVER(...) FROM sales GROUP BY date
-- ✅ 맞음!
SELECT LAG(amount) OVER(...) FROM sales
윈도우 함수 = 행 유지 = GROUP BY 불필요!
| 항목 | 내용 |
|---|---|
| LAG | 이전 행 |
| LEAD | 다음 행 |
| 문법 | 함수() OVER(ORDER BY ...) |
| GROUP BY | ❌ 필요 없음! |
| 계산 | price - LAG(price) OVER(...) 바로 가능! |
| 상황 | 사용 |
|---|---|
| 전일 대비 변화량 | price - LAG(price) |
| 전일 대비 증가율 | (price - LAG(price)) / LAG(price) * 100 |
| 다음 예약과 간격 | LEAD(date) - date |
이전/다음 행 비교할 때 = LAG/LEAD! 💪