개발/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()도 함께 고려 (동순위 인정 + 순번 건너뛰지 않음)
반응형