1. ROW_NUMBER()
- 고유한 순위를 부여
- 동일한 값이 있어도 각 행에 고유한 번호가 매김
- 건너뛰는 순위가 없음: 순위는 항상 연속적으로 증가
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM Employees;
name | salary | row_num |
Eve | 7000 | 1 |
Frank | 6500 | 2 |
David | 6500 | 3 |
Bob | 5000 | 4 |
Charlie | 4000 | 5 |
Alice | 3000 | 6 |
- Frank와 David의 급여가 같지만, ROW_NUMBER()는 이들에게 서로 다른 고유한 순위를 부여
2. RANK()
- 동일한 값이 있을 경우 같은 순위를 부여
- 동일한 순위가 부여된 후에는 그 다음 순위가 건너뜀
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM Employees;
name | salary | rank |
Eve | 7000 | 1 |
Frank | 6500 | 2 |
David | 6500 | 2 |
Bob | 5000 | 4 |
Charlie | 4000 | 5 |
Alice | 3000 | 6 |
- Frank와 David의 급여가 같으므로 둘 다 2위를 받음
- 그 다음 순위는 4위가 되고, 3위는 건너뜀
3. DENSE_RANK()
- 동일한 값에 동일한 순위를 부여
- 하지만 그 다음 순위는 건너뛰지 않고 연속적으로 부여
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM Employees;
name | salary | dense_ rank |
Eve | 7000 | 1 |
Frank | 6500 | 2 |
David | 6500 | 2 |
Bob | 5000 | 3 |
Charlie | 4000 | 4 |
Alice | 3000 | 5 |
- Frank와 David는 동일한 급여를 받았으므로 2위를 공유
- 하지만 그 다음 순위는 3위로 건너뛰지 않고 연속적으로 부여
요약
- ROW_NUMBER(): 데이터셋에서 고유한 번호를 매기고 싶을 때 사용합니다. 같은 값에도 개별 순번이 부여
- RANK(): 동일한 값에 대해 같은 순위를 주고, 그 다음 순위를 건너뛰고 싶을 때 사용
- DENSE_RANK(): 동일한 값에 대해 같은 순위를 주되, 건너뛰지 않고 연속적인 순위를 부여하고 싶을 때 사용
사용 예시
- ROW_NUMBER(): 주문 ID 같은 고유한 값을 매기고 싶을 때 사용.
- RANK(): 마라톤 대회 등에서 1등이 두 명이면 다음 순위가 3등이 되어야 할 때 사용.
- DENSE_RANK(): 성적 같은 상황에서 1등이 두 명이면 다음 순위가 2등이 되어야 할 때 사용.