본문 바로가기
IT ▶/Database

LAG() 함수 개념 / 데이터 형태 상관없이 무조건 이전 데이터를 불러오는건가?

by Jordan_ 2026. 3. 17.

 

 

 

🔑 한 줄 정의

LAG() = “현재 행 기준으로, 정렬 기준에 따라 이전 행의 값을 가져오는 함수”


❗ 중요한 포인트 (오해 방지)

❌ 그냥 “이전 데이터” 아님
ORDER BY 기준으로 정해진 이전 행


🔎 기본 구조

LAG(컬럼, offset)
OVER (
    PARTITION BY 기준
    ORDER BY 정렬기준
)

1️⃣ 핵심 개념 3가지

✔ 1. “이전”은 ORDER BY로 결정됨

ORDER BY p_ymdt

👉 날짜 기준으로 이전

ORDER BY amount

👉 금액 기준으로 이전

👉 즉, 정렬 기준 바꾸면 결과 완전히 달라짐


✔ 2. PARTITION으로 그룹 나뉨

PARTITION BY customer_id

👉 고객별로 따로 계산

  • 고객 A 안에서만 이전값
  • 고객 B 안에서만 이전값

👉 다른 고객 데이터랑 섞이지 않음


✔ 3. “행 기준”이지 “데이터 의미” 아님

LAG는 그냥

“바로 위 행 값 주세요”

입니다.

👉 의미까지 이해하지는 않음


📊 예시로 이해

데이터

고객결제일

A 1월
A 3월
A 2월

쿼리

LAG(p_ymdt) OVER (
    PARTITION BY customer_id
    ORDER BY p_ymdt
)

정렬 후 내부 처리

고객결제일이전값

A 1월 NULL
A 2월 1월
A 3월 2월

👉 정렬 먼저 → 그 다음 이전값 계산


⚠️ 데이터 형태 상관없냐?

✔ YES

  • 숫자
  • 날짜
  • 문자열

👉 전부 가능


❗ BUT 조건 있음

반드시 정렬 기준이 의미 있어야 함


❌ 잘못된 예

ORDER BY 없음

👉 아예 에러


ORDER BY 랜덤컬럼

👉 이전값 의미 없음 (쓰레기 결과)


🔥 실무에서 진짜 중요한 포인트

1️⃣ 정렬 기준이 핵심이다

  • 날짜 → 시간 흐름
  • 금액 → 크기 비교
  • ID → 순서 의미 없음

2️⃣ NULL 처리 필수

첫 행은 무조건 NULL

COALESCE(LAG(...), 0)

3️⃣ 집계랑 같이 쓰면 강력

DATEDIFF(현재, LAG(이전))

👉 구매 주기 계산


🧠 한 줄 요약

LAG는 “이전 데이터”가 아니라
“정렬 기준에 따라 바로 앞 행의 값”을 가져오는 함수


 

 

 

반응형