동점 처리
같은 점수에서 순위 번호가 갈라진다
정렬 기준은 같아도 동점 행을 어떻게 세느냐에 따라 결과 번호가 달라집니다. 90점 두 행을 기준으로 세 함수를 나란히 비교합니다.
ROW_NUMBER
동점이어도 행마다 고유 번호를 준다.
RANK
같은 순위를 주고 다음 번호는 건너뛴다.
DENSE_RANK
같은 순위를 주고 다음 번호를 바로 잇는다.
입력 정렬
score DESC| 순서 | 이름 | 점수 |
|---|---|---|
| 1 | 민준 | 100 |
| 2 | 서연 | 90 |
| 3 | 도윤 | 90 |
| 4 | 지우 | 80 |
두 번째와 세 번째 행이 같은 점수라서 순위 함수의 차이가 드러난다.
결과 비교
90점 동점| 점수 | 이름 | RN | RANK | DR |
|---|---|---|---|---|
| 100 | 민준 | 1 | 1 | 1 |
| 90 | 서연 | 2 | 2 | 2 |
| 90 | 도윤 | 3 | 2 | 2 |
| 80 | 지우 | 4 | 4 | 3 |
쿼리 기준
OVER 절SELECT name, score,
ROW_NUMBER() OVER (
ORDER BY score DESC, name
) AS rn,
RANK() OVER (
ORDER BY score DESC
) AS rnk,
DENSE_RANK() OVER (
ORDER BY score DESC
) AS dr
FROM exam_result;
정확히 N개 행만 뽑는 화면이라면 ROW_NUMBER에 보조 정렬 기준을 넣어 결과를 고정한다.
1234
행 수를 그대로 세므로 동점이어도 번호가 모두 다르다.
1224
공동 2등이 두 명이라 다음 순위는 3이 아니라 4가 된다.
1223
공동 순위는 유지하지만 비어 있는 번호 없이 바로 이어진다.
TOP-N의 행 개수 보장이 중요하면 ROW_NUMBER, 공동 순위 포함이 중요하면 RANK, 등급처럼 연속 번호가 필요하면 DENSE_RANK를 고른다.