group_name ASC반 평균 낼 때 혼자 만점인 애를 빼고 계산. 단, 빼는 순서가 중요하다.
이 순서를 바꾸면 답이 달라진다.
| ① | 거래 없는 참가자를 0 으로 채운다 |
| ② | 그 상태에서 그룹별로 등수를 매긴다 |
| ③ | 맨 위를 자른다 |
| ④ | 남은 사람으로 평균 |
①을 빼고 ②를 하면 모집단이 달라져서 잘려나갈 사람도 달라진다.
COALESCE(금액, 0).PERCENT_RANK() OVER (PARTITION BY 그룹 ORDER BY 금액).WHERE 등수 <= 0.99.WHERE 에 못 쓴다. WHERE PERCENT_RANK() OVER (…) <= 0.99 는 문법 오류다. 실행 순서가 WHERE 먼저, 등수 나중이라서 그렇다. 한 단 감싸는 것 외에 방법이 없다.PERCENT_RANK 는 맨 위가 항상 정확히 1.0 이다. 그래서 > 0.99 는 '상위 1%' 가 아니라 거의 항상 맨 위 한 명만 자른다. 문제가 그렇게 시켰으니 그대로 풀되, 이게 허술한 정의라는 건 알고 있어라. 면접에서 물으면 '진짜 상위 1% 는 NTILE(100) 로 자른다' 고 답하면 된다.묻는 것 · 순서가 생명인 문제. ①0 채우기 → ②순위 매기기 → ③자르기 → ④집계. 이 순서를 바꾸면 답이 달라진다.
COALESCE(금액, 0) 으로 0 을 채운다. 분모는 참가자 수여야 한다.PERCENT_RANK() OVER (PARTITION BY group_name ORDER BY amt). 0 을 채운 뒤에 순위를 매기는 것이 중요하다 — 0 인 유저도 모집단의 일부다.WHERE pr <= 0.99 로 이상치를 떨어뜨린다. 윈도우 함수는 WHERE 에서 못 쓰므로 반드시 서브쿼리/CTE 로 한 단 감싸야 한다.COUNT(*), SUM(amt), 그리고 ROUND(SUM(amt)/COUNT(*), 0).WITH j AS (
SELECT e.user_id, e.group_name,
COALESCE(s.total_trading_amount, 0) AS amt
FROM experiment_users e
LEFT JOIN user_trades_summary s ON s.user_id = e.user_id
),
p AS (
SELECT group_name, amt,
PERCENT_RANK() OVER (PARTITION BY group_name ORDER BY amt) AS pr
FROM j
)
SELECT group_name,
COUNT(*) AS user_count,
SUM(amt) AS group_total_amount,
ROUND(SUM(amt) / COUNT(*), 0) AS arpu
FROM p
WHERE pr <= 0.99
GROUP BY group_name
ORDER BY group_name;WHERE PERCENT_RANK() OVER (...) <= 0.99 는 문법 오류다. 실행 순서가 WHERE → 윈도우 함수이기 때문이다. 한 단 감싸는 것 외에 방법이 없다.(순위 − 1) / (전체 − 1) 이므로 최솟값은 항상 0, 최댓값은 항상 1 이다. 그래서 > 0.99 는 '상위 1%' 가 아니라 거의 항상 최댓값 행만 떨어뜨린다. 그룹에 2명뿐이면 1명이 날아간다. 면접에서 물으면 '진짜 상위 1% 는 NTILE(100) 이나 PERCENTILE_CONT 로 임계값을 구해 자른다' 고 답하라.150 또는 150.0 으로 보인다. 정수형으로 받아야 하면 CAST(ROUND(...) AS SIGNED) 까지 써라.“상·하위 1% 양쪽 제거”면 pr BETWEEN 0.01 AND 0.99. “중앙값 비교”면 ROW_NUMBER + COUNT() OVER 패턴. “전환율 비교”면 COUNT(DISTINCT 전환유저)/COUNT(DISTINCT 참가자) 로 분모를 참가자 전체로 둔다 (intention-to-treat).