본문 바로가기
Database/Oracle

[ORACLE] DENSE_RANK() 함수 완전 정복 : 순위 함수 실전 예제로 배우기

by Papa Martino V 2025. 5. 31.
728x90

오라클 DENSE_RANK() 함수 완전 정복: 순위 함수 실전 예제로 배우기
[ ORACLE ] DENSE_RANK()

1. DENSE_RANK란?

DENSE_RANK는 Oracle의 분석 함수 중 하나로, 지정된 정렬 기준에 따라 순위를 부여하지만 동일한 값이 있어도 순위를 건너뛰지 않는 특징을 가집니다. 이 함수는 데이터 집계 및 정렬 결과를 순서화할 때 유용합니다.

📌 기본 문법

DENSE_RANK() OVER (PARTITION BY 컬럼명 ORDER BY 컬럼명 [ASC|DESC])

2. DENSE_RANK의 작동 원리

중복된 값이 존재할 경우에도 순위가 연속적으로 유지됩니다. 예를 들어, 동일한 급여가 있는 두 명의 직원이 1등이면, 다음 순위는 2등이 아니라 3등이 됩니다 (RANK의 경우). 하지만 DENSE_RANK는 다음 순위를 2등으로 유지합니다.

예제: 직원 급여 순위

SELECT ename, sal,
       DENSE_RANK() OVER (ORDER BY sal DESC) AS dense_rank
  FROM emp;

3. DENSE_RANK vs RANK vs ROW_NUMBER

함수 중복 처리 순위 건너뜀
DENSE_RANK() 같은 값에 같은 순위 건너뜀 없음
RANK() 같은 값에 같은 순위 O (중복만큼 순위 건너뜀)
ROW_NUMBER() 항상 고유한 순위 건너뜀 없음

예제 비교

SELECT ename, sal,
       RANK() OVER (ORDER BY sal DESC) AS rank,
       DENSE_RANK() OVER (ORDER BY sal DESC) AS dense_rank,
       ROW_NUMBER() OVER (ORDER BY sal DESC) AS row_num
  FROM emp;

4. PARTITION BY와 결합

PARTITION BY를 사용하면 특정 그룹 내에서의 순위를 계산할 수 있습니다.

예제: 부서별 급여 순위

SELECT deptno, ename, sal,
       DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS dept_rank
  FROM emp;

5. 실전 예제

💼 예제 1: 월별 고객 등급 산정

SELECT customer_id, purchase_month, purchase_amount,
       DENSE_RANK() OVER (PARTITION BY purchase_month ORDER BY purchase_amount DESC) AS rank_by_month
  FROM customer_purchases;

💼 예제 2: 부서별 성과 평가

SELECT emp_id, deptno, score,
       DENSE_RANK() OVER (PARTITION BY deptno ORDER BY score DESC) AS performance_rank
  FROM evaluation_results;

6. 성능 고려 사항

  • 정렬 칼럼에 인덱스가 설정되어 있으면 분석 함수 수행 속도가 향상됩니다.
  • DENSE_RANK는 메모리 기반 정렬 수행 → 대용량 데이터는 성능 모니터링 필요
  • 복합 칼럼 정렬 시에는 ORDER BY col1 DESC, col2 ASC와 같이 지정
💡 TIP: 순위가 중요한 보고서에서는 DENSE_RANK()를 사용하는 것이 RANK()보다 시각적으로 더 자연스럽습니다.

7. 활용 분야 요약

적용 사례 설명
랭킹 보고서 점수, 판매액, 급여 등 순위 집계
누적 분석 기간별 순위 변화 트래킹
추천 시스템 상위 N개 항목 선정

8. 정리

  • DENSE_RANK()는 중복 순위가 있어도 순위를 건너뛰지 않는 분석 함수
  • PARTITION BY와 함께 쓰면 그룹별 순위 분석 가능
  • RANK(), ROW_NUMBER()와 함께 비교해 쓰임새 이해 필요

9. 참고 문헌 및 출처

728x90