57. SQL - LAG/LEAD (이전/다음 행 가져오기)

Jason·2026년 2월 1일

SQL

목록 보기
40/47
post-thumbnail

SQL 내가 틀린 것들 #57 — LAG/LEAD로 이전/다음 행 가져오기


💡 LAG / LEAD란?

함수의미
LAG이전 행 값 가져오기
LEAD다음 행 값 가져오기

📌 기본 문법

LAG(컬럼) OVER(ORDER BY 정렬기준)   -- 이전 행
LEAD(컬럼) OVER(ORDER BY 정렬기준)  -- 다음 행

윈도우 함수니까 () OVER() 필수!


🔍 예시: 일별 매출 + 전날/다음날 매출

테이블

sale_dateamount
2024-06-01100000
2024-06-02120000
2024-06-0390000

쿼리

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_dateamountprev_amountnext_amount
2024-06-01100000NULL120000
2024-06-0212000010000090000
2024-06-0390000120000NULL

첫 행의 LAG = NULL, 마지막 행의 LEAD = NULL


🔥 대박 포인트: LAG 결과로 바로 계산 가능!

전일 대비 변화량 구하기

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_datepriceprev_priceprice_change
2024-07-0150000NULLNULL
2024-07-0252000500002000
2024-07-034800052000-4000

💡 괄호 있이 vs 없이

-- 둘 다 같은 결과!
price - LAG(price) OVER(ORDER BY stock_date)
price - (LAG(price) OVER(ORDER BY stock_date))

복잡한 계산이면 괄호 치는 게 가독성 좋음!


⚠️ 주의: GROUP BY 필요 없음!

-- ❌ 틀림!
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! 💪

업로드중..

profile
Data Analyst | Thoughts Become Things. 할 수 있다고 생각하면 할 수 있다. 할 수 없다고 생각하면 할 수 없다. | www.linkedin.com/in/명수-제-7ab843200

0개의 댓글