월별 플랜 업그레이드 / 다운그레이드

난이도 보통 · 권장 10분 · 출력 컬럼 month, upgrades, downgrades
이 문제 직접 풀어보기 →

문제

결제 이력에서 직전 결제와 플랜이 달라진 건을 찾아, 월별 업그레이드 (basic→pro)와 다운그레이드(pro→basic) 건수를 구하세요. · 유저의 첫 결제는 변경이 아니므로 제외합니다. · 변경이 한 건도 없는 달은 결과에서 제외합니다. · 월 오름차순으로 정렬하세요.
정렬 month ASC

쉽게 설명하면

지난번에 뭐 썼는지와 이번에 뭐 쓰는지를 비교. 달라졌으면 '변경' 이다.

결제이번 플랜직전 플랜판정
1차basic(없음)첫 결제 — 제외
2차probasic업그레이드
3차propro그대로 — 제외
4차basicpro다운그레이드

이렇게 푼다

  1. 결제 줄마다 직전 결제의 플랜을 한 칸 위에서 끌어온다 (LAG, 사람별로 묶고 날짜 순서로).
  2. 직전 플랜이 없으면 첫 결제니까 빼 버린다.
  3. basic → pro 면 업, pro → basic 이면 다운으로 센다.
  4. 월별로 합친다.

이것만 피하면 된다

자세히

묻는 것 · 직전 행과 비교할 줄 아는가.

풀이 순서

  1. 유저별 결제 순서로 LAG(plan).
  2. 직전 플랜과 현재 플랜을 비교해 방향을 판정.
  3. 첫 결제는 직전이 NULL 이므로 제외.

정답 (MySQL)

WITH l AS (
  SELECT user_id, paid_date, plan,
         LAG(plan) OVER (PARTITION BY user_id ORDER BY paid_date) AS prev_plan
  FROM payments
)
SELECT DATE_FORMAT(paid_date, '%Y-%m') AS month,
       SUM(CASE WHEN prev_plan='basic' AND plan='pro'   THEN 1 ELSE 0 END) AS upgrades,
       SUM(CASE WHEN prev_plan='pro'   AND plan='basic' THEN 1 ELSE 0 END) AS downgrades
FROM l
WHERE prev_plan IS NOT NULL
GROUP BY month
HAVING upgrades + downgrades > 0
ORDER BY month;

함정

이렇게 변형된다

“상태가 바뀐 시점”, “가격이 인상된 건” 전부 같은 구조.

← Q6. 채널별 첫 결제까지 일수의 중앙값Q8. 3개월 이상 연속 결제한 유저 →