순위를 매기는 쿼리,
어떤 함수를 써야 할지 헷갈렸던 적 있으신가요?
ROW_NUMBER, RANK, DENSE_RANK는 모두 순위를 구하지만
동점 처리 방식이 다릅니다.
SELECT name
, score
, ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num
, RANK() OVER (ORDER BY score DESC) AS rank
, DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM players;
| name | score | row_num | rank | dense_rank |
|---|---|---|---|---|
| A | 100 | 1 | 1 | 1 |
| B | 100 | 2 | 1 | 1 |
| C | 90 | 3 | 3 | 2 |
ROW_NUMBER()
→ 동점 상관없이 순서대로 번호 부여
→ 무조건 1, 2, 3, 4, ...
RANK()
→ 동점이면 같은 순위 / 다음 순위 건너뜀
→ 예: 1, 1, 3, 4, ...
DENSE_RANK()
→ 동점이면 같은 순위 / 순위 건너뛰지 않음
→ 예: 1, 1, 2, 3, ...
✔️ 동점 처리 기준에 따라, 알맞은 함수를 선택하여 사용하세요.