SQL에 대한 기본 지식은 갖췄다고 생각했으나 애매했던 부분에 대해서만 정리했습니다.
MySQL에서 랭킹(Ranking) 함수들은 데이터를 정렬된 순서에 따라 순위를 부여할 때 사용하는 윈도우 함수(Window Function)이다.
대표적인 함수로는 다음 세 가지가 있다.
✅ 1. RANK()
- 같은 값에는 같은 순위를 부여하고, 그 다음 순위는 건너뛴다. (즉, 중복 순위 발생 시 건너뜀).
- 예시:
SELECT name, score,
RANK() OVER (ORDER BY score DESC) AS ranking
FROM students;
name | score | ranking |
A | 100 | 1 |
B | 100 | 1 |
C | 90 | 3 |
✅ 2. DENSE_RANK()
- RANK()와 비슷하지만 순위가 건너뛰지 않는다.
- 예시:
SELECT name, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS ranking
FROM students;
name | score | ranking |
A | 100 | 1 |
B | 100 | 1 |
C | 90 | 2 |
✅ 3. ROW_NUMBER()
- 모든 행에 고유한 순위를 부여합니다 (중복 없음).
- 동일한 값이 있어도 순위는 고유하게 올라간다. 즉, 정렬된 순서대로 순위를 부여한다.
- 예시:
SELECT name, score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS ranking
FROM students;
name | score | ranking |
A | 100 | 1 |
B | 100 | 2 |
C | 90 | 3 |
🔧 추가 설명
- OVER 절 안에는 다음을 포함할 수 있다:
- PARTITION BY: 그룹별로 순위 매김
- ORDER BY: 정렬 기준 지정
- 예시: 학급별 점수 순위
id | name | class | score |
1 | Alice | A | 90 |
2 | Bob | A | 95 |
3 | Carol | A | 90 |
4 | Dave | B | 85 |
5 | Erin | B | 90 |
6 | Frank | B | 80 |
SELECT
class,
name,
score,
RANK() OVER (PARTITION BY class ORDER BY score DESC) AS class_rank
FROM students;
결과:
class | name | score | class_rank |
A | Bob | 95 | 1 |
A | Alice | 90 | 2 |
A | Carol | 90 | 2 |
B | Erin | 90 | 1 |
B | Dave | 85 | 2 |
B | Frank | 80 | 3 |
📌 요약 비교
함수 | 중복 순위 허용 | 순위 건너뜀 | 유일한 순위 |
RANK() | ✅ | ✅ | ❌ |
DENSE_RANK() | ✅ | ❌ | ❌ |
ROW_NUMBER() | ❌ | ❌ | ✅ |