20. SQL - 반복해서 틀리는 것들 (#1) lag datediff mistakes

Jason·2026년 1월 15일

SQL

목록 보기
19/47

[SQL 코테] LAG + DATEDIFF 내가 틀린 것들 정리 🔥

🚨 핵심 실수 포인트 (시험 전 필독!)

1. 같은 SELECT에서 별칭 참조 ❌ → LAG를 DATEDIFF 안에 직접!
2. LAG는 윈도우 함수! OVER() 필수!
3. 집계 아니면 GROUP BY/HAVING ❌ → WHERE ✅
4. "이내" = 이하(<=), "이상" = 이상(>=) 방향 주의!

📝 문제: N일 이내 재구매 찾기

테이블 구조

orders 테이블
order_id | user_id | order_date
---------|---------|------------
1        | 201     | 2024-02-01
2        | 201     | 2024-02-05
3        | 201     | 2024-02-20
4        | 202     | 2024-02-10
5        | 202     | 2024-02-12

요구사항

  • 이전 구매일로부터 5일 이내 재구매한 기록 찾기

✅ 정답 쿼리

WITH lagged AS ( 
  SELECT 
    user_id, order_date, 
    LAG(order_date) OVER(PARTITION BY user_id ORDER BY order_date) AS prev_order_date, 
    DATEDIFF(order_date, LAG(order_date) OVER(PARTITION BY user_id ORDER BY order_date)) AS days_diff 
  FROM orders 
) 
SELECT user_id, prev_order_date, order_date, days_diff 
FROM lagged 
WHERE days_diff <= 5;

❌ 내가 틀린 것들

1. 같은 SELECT에서 별칭 참조 불가

-- ❌ prev_order_date 바로 못 써!
LAG(order_date) OVER(...) AS prev_order_date,
DATEDIFF(order_date, prev_order_date) AS days_diff

-- ✅ LAG를 DATEDIFF 안에 직접 넣기
LAG(order_date) OVER(...) AS prev_order_date,
DATEDIFF(order_date, LAG(order_date) OVER(...)) AS days_diff

이유: SQL은 SELECT 절을 동시에 처리해서 방금 만든 별칭을 바로 참조 못함!


2. LAG는 윈도우 함수! OVER() 필수!

-- ❌ OVER() 빠짐
DATEDIFF(order_date, LAG(order_date)) AS days_diff

-- ✅ OVER() 필수!
DATEDIFF(order_date, LAG(order_date) OVER(PARTITION BY user_id ORDER BY order_date)) AS days_diff

기억: LAG, LEAD, ROW_NUMBER, RANK 등 윈도우 함수는 항상 OVER() 필수!


3. GROUP BY/HAVING vs WHERE 구분

-- ❌ 집계 아닌데 GROUP BY 씀
GROUP BY user_id, days_diff
HAVING days_diff <= 5

-- ✅ 단순 필터링은 WHERE!
WHERE days_diff <= 5

구분법:

  • WHERE: 행 필터링 (집계 전)
  • HAVING: 그룹 필터링 (GROUP BY 후 집계 결과 필터)

4. 조건 방향 주의!

-- ❌ "5일 이내"인데 "이상"으로 씀
HAVING days_diff >= 5

-- ✅ 5일 이내 = 5 이하
WHERE days_diff <= 5

💡 핵심 패턴 정리

WITH lagged AS (
  SELECT 
    컬럼들,
    LAG(날짜) OVER(PARTITION BY 그룹 ORDER BY 날짜) AS prev_date,
    DATEDIFF(날짜, LAG(날짜) OVER(PARTITION BY 그룹 ORDER BY 날짜)) AS days_diff
  FROM 테이블
)
SELECT *
FROM lagged
WHERE days_diff <= N;

🎯 체크리스트

  • 같은 SELECT에서 별칭 참조 ❌ → LAG를 DATEDIFF 안에 직접
  • LAG에 OVER() 붙였는지 확인
  • 집계 아니면 WHERE 사용 (GROUP BY/HAVING ❌)
  • 조건 방향 확인 (이내 = 이하, 이상 ≠ 이내)

채널톡 DA 인턴 코테 준비 중 정리한 내용입니다 🚀

profile
Data Expert 가 되고싶은 사람 | Thoughts Become Things. 할 수 있다고 생각하면 할 수 있다. 할 수 없다고 생각하면 할 수 없다. | www.linkedin.com/in/명수-제-7ab843200

0개의 댓글