SQL에서 순위를 매길 때는 주로 윈도우 함수(Window Function)를 사용합니다. 이 글에서는 순위를 계산하는 대표적인 함수들인 RANK(), DENSE_RANK(), ROW_NUMBER(), NTILE()에 대해 개념, 작동 방식, 차이점 등을 정리합니다.
같은 값에는 같은 순위를 부여하고, 다음 순위는 중복 개수만큼 건너뜀 (순위의 간격 존재).
SELECT 이름, 점수,
RANK() OVER (ORDER BY 점수 DESC) AS 순위
FROM 성적표;
| 이름 | 점수 | 순위 |
|---|---|---|
| A | 100 | 1 |
| B | 100 | 1 |
| C | 90 | 3 |
| D | 80 | 4 |
B와 A가 공동 1등 → 다음 순위는 3등
RANK()와 유사하지만, 중간 순위가 건너뛰지 않음 (순위의 간격 없음).
SELECT 이름, 점수,
DENSE_RANK() OVER (ORDER BY 점수 DESC) AS 순위
FROM 성적표;
| 이름 | 점수 | 순위 |
|---|---|---|
| A | 100 | 1 |
| B | 100 | 1 |
| C | 90 | 2 |
| D | 80 | 3 |
공동 순위 이후에도 바로 다음 등수 부여
중복 없이 고유한 순위를 부여 (정렬 기준이 같아도 고유 번호를 매김).
정렬된 순서에 따라 1부터 순차적으로 증가.
SELECT 이름, 점수,
ROW_NUMBER() OVER (ORDER BY 점수 DESC) AS 순위
FROM 성적표;
| 이름 | 점수 | 순위 |
|---|---|---|
| A | 100 | 1 |
| B | 100 | 2 |
| C | 90 | 3 |
| D | 80 | 4 |
절대 중복 없는 일련번호로 순위를 매길 때 사용
지정한 n개의 그룹으로 데이터를 균등하게 분할해 그룹 번호를 부여합니다.
순위가 아니라 분위 개념에 가깝습니다.
SELECT 이름, 점수,
NTILE(2) OVER (ORDER BY 점수 DESC) AS 분위
FROM 성적표;
| 이름 | 점수 | 분위 |
|---|---|---|
| A | 100 | 1 |
| B | 90 | 1 |
| C | 80 | 2 |
| D | 70 | 2 |
전체를 2개 그룹으로 나눠 각자 번호 부여
| 함수 | 순위 중복 | 순위 건너뜀 | 고유 순위 | 분위 분할 | 주 사용 목적 |
|---|---|---|---|---|---|
RANK() | O | O | ✖ | ✖ | 공동 순위 포함 등수 매김 |
DENSE_RANK() | O | ✖ | ✖ | ✖ | 연속적인 순위 매김 |
ROW_NUMBER() | ✖ | ✖ | O | ✖ | 고유 번호/순번 부여 |
NTILE(n) | ✖ | ✖ | ✖ | O | n등분 그룹화 |
RANK()DENSE_RANK()ROW_NUMBER()NTILE(n)