ltv DESC돈 쓴 손님만 모아서 1인당 평균 얼마 썼나. 안 쓴 손님은 평균에서 뺀다.
| 분자 | 분모 | |
|---|---|---|
| 결제 비중 | 결제한 사람 | 전체 유저 |
| LTV | 총 결제액 | 결제한 사람 |
같은 문제 안에서 분모가 두 번 바뀐다. 여기서 헷갈린다.
* 1.0 또는 100.0 을 꼭 넣어라.묻는 것 · 분모가 다른 지표 두 개를 한 쿼리에서 만들 줄 아는가.
COUNT(*) 는 전체 유저, COUNT(결제컬럼) 은 결제 유저. NULL 을 세지 않는 성질을 이용한다.WITH pu AS (
SELECT user_id, SUM(amount) AS amt FROM payments GROUP BY user_id
)
SELECT u.channel,
COUNT(*) AS total_users,
COUNT(pu.user_id) AS paying_users,
ROUND(100.0 * COUNT(pu.user_id) / COUNT(*), 2) AS paying_ratio,
ROUND(AVG(pu.amt), 2) AS ltv
FROM users u
LEFT JOIN pu ON pu.user_id = u.user_id
GROUP BY u.channel
ORDER BY ltv DESC;COUNT(*) 와 COUNT(컬럼) 의 차이다. 분모 두 개를 CASE 없이 만들 수 있다.AVG(COALESCE(amt,0)) 로 쓰면 결제 안 한 유저가 0 으로 들어가 LTV 가 내려간다. 의도가 다르다.“ARPU vs ARPPU” 가 정확히 이 차이다. ARPU 는 전체 유저, ARPPU 는 결제 유저 기준.