개발/SQL
[Oracle] ROW_NUMBER vs RANK 차이점 총정리! 순위 함수 비교와 실전 예제
sarah.together
2025. 6. 22. 21:03
반응형
✅ 개요
오라클에서 순위를 매기기 위한 함수로 자주 사용하는 ROW_NUMBER()와 RANK()는 비슷해 보이지만 중요한 차이점이 있습니다. 특히 동순위 처리 방식, 고유성, 성능 관점에서 용도가 달라지므로, 정확히 이해하고 써야 정확한 결과와 성능을 확보할 수 있습니다.
🔍 기본 문법 비교
-- ROW_NUMBER()
ROW_NUMBER() OVER(PARTITION BY 컬럼 ORDER BY 정렬컬럼)
-- RANK()
RANK() OVER(PARTITION BY 컬럼 ORDER BY 정렬컬럼)
- PARTITION BY: 그룹 기준
- ORDER BY: 순위 기준 컬럼
- 둘 다 윈도우 함수이며, 정렬 방식에 따라 순위 또는 번호를 매김
📊 차이점 요약
항목ROW_NUMBER()RANK()
순위 중복 여부 | ❌ 없음 (항상 고유한 번호) | ✅ 있음 (동순위 시 같은 값) |
순번 건너뜀 여부 | ❌ 연속 번호 (1, 2, 3, 4...) | ✅ 건너뜀 (1, 1, 3, 4...) |
용도 | 정확히 하나만 뽑을 때 (TOP 1 등) | 동순위 인정 시 (TOP N 등) |
예제 사용 케이스 | 부서별 1등만 뽑기, 고유 순번 필요 시 | 그룹 내 상위 순위 필터링 등 |
📘 예제 비교
🔸 RANK() 예제
SELECT
emp_name, salary,
RANK() OVER(ORDER BY salary DESC) AS rnk
FROM employees;
동일 급여에 동일 순위, 이후 순번 건너뜀.
emp_namesalaryrnk
김철수 | 6000 | 1 |
박영희 | 6000 | 1 |
이민호 | 5500 | 3 |
🔸 ROW_NUMBER() 예제
SELECT
emp_name, salary,
ROW_NUMBER() OVER(ORDER BY salary DESC) AS rn
FROM employees;
무조건 고유한 번호, 순위 건너뛰지 않음.
emp_namesalaryrn
김철수 | 6000 | 1 |
박영희 | 6000 | 2 |
이민호 | 5500 | 3 |
🛠 실무 팁
- ROW_NUMBER()는 보통 TOP 1 추출이나 중복 제거 등에 사용
- RANK()는 베스트셀러 상위 3위, 성적 동순위 처리 등에서 사용
- DENSE_RANK()도 함께 고려 (동순위 인정 + 순번 건너뛰지 않음)
반응형