동점 처리

같은 점수에서 순위 번호가 갈라진다

정렬 기준은 같아도 동점 행을 어떻게 세느냐에 따라 결과 번호가 달라집니다. 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에 보조 정렬 기준을 넣어 결과를 고정한다.

ROW_NUMBER
1234

행 수를 그대로 세므로 동점이어도 번호가 모두 다르다.

RANK
1224

공동 2등이 두 명이라 다음 순위는 3이 아니라 4가 된다.

DENSE_RANK
1223

공동 순위는 유지하지만 비어 있는 번호 없이 바로 이어진다.

TOP-N의 행 개수 보장이 중요하면 ROW_NUMBER, 공동 순위 포함이 중요하면 RANK, 등급처럼 연속 번호가 필요하면 DENSE_RANK를 고른다.