728x90

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. 참고 문헌 및 출처
- Oracle 공식 문서 - docs.oracle.com
- Oracle SQL Tutorial - oracletutorial.com
- Stack Overflow - #oracle-dense-rank
728x90
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] SUM() 함수 기본 문법부터 실무 활용 팁까지 (0) | 2025.05.31 |
|---|---|
| [ORACLE] ROW_NUMBER() 함수 완벽 가이드 : 순위 매기기 실전 예제로 배우기 (0) | 2025.05.31 |
| [ORACLE] PARTITION BY() 함수 설명과 실무 SQL 예제 모음 (0) | 2025.05.31 |
| [ORACLE] RANK() OVER 함수로 그룹 별 순위 구하기 실습 가이드 (0) | 2025.05.31 |
| [ORACLE] LISTAGG()로 컬럼 값을 한 줄에 나열하는 방법 (0) | 2025.05.31 |