
| 문제 | 함수 |
|---|---|
| 며칠? | DATEDIFF |
| 몇 개월/주 차? | TIMESTAMPDIFF |
□ "며칠" → DATEDIFF
□ "몇 개월/주 차" → TIMESTAMPDIFF
□ 테이블명, 컬럼명 오타 확인!
□ 첫 구매/로그인 → WITH + MIN() + GROUP BY
| 문제 | 정답 함수 |
|---|---|
| 첫 구매까지 며칠? | DATEDIFF(구매일, 가입일) |
| 가입 후 몇 개월 차? | TIMESTAMPDIFF(MONTH, 가입일, 구매일) |
| 가입 후 몇 주 차? | TIMESTAMPDIFF(WEEK, 가입일, 로그인일) |
기억법:
-- ❌ 테이블은 orders인데 purchases로 씀
JOIN purchases p ON ...
p.purchase_date
-- ✅ 문제에서 준 테이블명 그대로!
JOIN orders o ON ...
o.order_date
팁: 문제 읽고 테이블명, 컬럼명 먼저 확인!
"첫 구매"까지 며칠 → WITH + MIN 필요!
-- ❌ 모든 주문이 다 들어감
FROM users u
JOIN orders o ON u.user_id = o.user_id
-- ✅ 첫 주문만!
WITH first_orders AS (
SELECT user_id, MIN(order_date) AS first_order_date
FROM orders
GROUP BY user_id ← GROUP BY 필수!
)
FROM users u
JOIN first_orders fo ON u.user_id = fo.user_id
SELECT
DATE_FORMAT(u.signup_date, '%Y-%m') AS cohort_month,
TIMESTAMPDIFF(MONTH, u.signup_date, o.order_date) AS month_number,
COUNT(DISTINCT u.user_id) AS retained_users
FROM users u
JOIN orders o ON u.user_id = o.user_id
GROUP BY cohort_month, month_number
ORDER BY cohort_month, month_number;
WITH first_orders AS (
SELECT user_id, MIN(order_date) AS first_order_date
FROM orders
GROUP BY user_id
)
SELECT
DATE_FORMAT(u.signup_date, '%Y-%m') AS cohort_month,
ROUND(AVG(DATEDIFF(fo.first_order_date, u.signup_date)), 1) AS avg_days
FROM users u
JOIN first_orders fo ON u.user_id = fo.user_id
GROUP BY cohort_month
ORDER BY cohort_month;
채널톡 DA 인턴 코테 준비 중 정리한 내용입니다 🚀
