month ASC지난번에 뭐 썼는지와 이번에 뭐 쓰는지를 비교. 달라졌으면 '변경' 이다.
| 결제 | 이번 플랜 | 직전 플랜 | 판정 |
|---|---|---|---|
| 1차 | basic | (없음) | 첫 결제 — 제외 |
| 2차 | pro | basic | 업그레이드 |
| 3차 | pro | pro | 그대로 — 제외 |
| 4차 | basic | pro | 다운그레이드 |
LAG, 사람별로 묶고 날짜 순서로).업 + 다운 > 0 으로 써라.업 != 0 AND 다운 != 0 으로 쓰면 한쪽만 있는 달이 사라진다. 업그레이드만 5건 있는 달도 나와야 하는데 없어진다.PARTITION BY user_id) 빼먹으면 다른 사람의 플랜과 비교해 버린다.묻는 것 · 직전 행과 비교할 줄 아는가.
LAG(plan).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;PARTITION BY user_id 누락 — 다른 유저의 플랜과 비교하게 된다.prev_plan IS NOT NULL.“상태가 바뀐 시점”, “가격이 인상된 건” 전부 같은 구조.