27. SQL - 반복해서 틀리는 것들 (#4) cohort mistakes

Jason·2026년 1월 16일

SQL

목록 보기
26/47

[SQL 코테] 코호트 문제 - 내가 자주 틀리는 것들 🔥

🎯 핵심만 기억해!

문제함수
며칠?DATEDIFF
몇 개월/주 차?TIMESTAMPDIFF

🚨 시험 직전 체크리스트!

□ "며칠" → DATEDIFF
□ "몇 개월/주 차" → TIMESTAMPDIFF
□ 테이블명, 컬럼명 오타 확인!
□ 첫 구매/로그인 → WITH + MIN() + GROUP BY

❌ 실수 1: "며칠" vs "몇 개월 차" 헷갈림

문제정답 함수
첫 구매까지 며칠?DATEDIFF(구매일, 가입일)
가입 후 몇 개월 차?TIMESTAMPDIFF(MONTH, 가입일, 구매일)
가입 후 몇 주 차?TIMESTAMPDIFF(WEEK, 가입일, 로그인일)

기억법:

  • 며칠 = Day = DATEDIFF
  • 몇 개월/주 = MONTH/WEEK = TIMESTAMPDIFF

❌ 실수 2: 테이블명/컬럼명 오타

-- ❌ 테이블은 orders인데 purchases로 씀
JOIN purchases p ON ...
p.purchase_date

-- ✅ 문제에서 준 테이블명 그대로!
JOIN orders o ON ...
o.order_date

팁: 문제 읽고 테이블명, 컬럼명 먼저 확인!


❌ 실수 3: 첫 구매/로그인 구할 때

"첫 구매"까지 며칠 → 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

🎯 코호트 문제 2가지 패턴

패턴 1: N개월/주 차 리텐션

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;

패턴 2: 첫 구매까지 평균 며칠

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 인턴 코테 준비 중 정리한 내용입니다 🚀

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

0개의 댓글