
1. 같은 SELECT에서 별칭 참조 ❌ → LAG를 DATEDIFF 안에 직접!
2. LAG는 윈도우 함수! OVER() 필수!
3. 집계 아니면 GROUP BY/HAVING ❌ → WHERE ✅
4. "이내" = 이하(<=), "이상" = 이상(>=) 방향 주의!
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
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;
-- ❌ 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 절을 동시에 처리해서 방금 만든 별칭을 바로 참조 못함!
-- ❌ 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() 필수!
-- ❌ 집계 아닌데 GROUP BY 씀
GROUP BY user_id, days_diff
HAVING days_diff <= 5
-- ✅ 단순 필터링은 WHERE!
WHERE days_diff <= 5
구분법:
-- ❌ "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;
채널톡 DA 인턴 코테 준비 중 정리한 내용입니다 🚀
