PERCENT_RANK()
는 Oracle SQL의 윈도(분석) 함수 중 하나로, 지정한 정렬 기준에 따라 각 행이 전체 데이터 내에서 어떤 순위 백분율을 갖는지 알려주는 함수입니다. 특히 동점자가 있는 경우, 해당 순위의 비율을 계산해 주는 점이 CUME_DIST()
와의 중요한 차이점입니다.
1. 기본 문법
PERCENT_RANK() OVER (
PARTITION BY column1
ORDER BY column2
)
- PARTITION BY: 그룹을 나누는 기준 (선택 사항)
- ORDER BY: 순위를 매기는 기준 (필수)
2. PERCENT_RANK() 계산 공식
PERCENT_RANK는 다음의 수식으로 계산됩니다:
(RANK - 1) / (전체 행 수 - 1)
이 공식에 따라 첫 번째 행의 백분율은 항상 0이 되며, 마지막 행은 1에 근접합니다.
3. 기본 사용 예제
SELECT employee_id, department_id, salary,
PERCENT_RANK() OVER (ORDER BY salary) AS percent_rank
FROM employees;
이 쿼리는 급여 기준으로 전체 직원의 순위 백분율을 계산합니다.
4. 그룹 내 사용 (PARTITION BY)
SELECT employee_id, department_id, salary,
PERCENT_RANK() OVER (
PARTITION BY department_id
ORDER BY salary DESC
) AS dept_percent_rank
FROM employees;
부서별로 급여 순위 백분율을 계산할 수 있으며, 상대적인 부서 내 순위 평가에 유용합니다.
5. 실전 예제
5.1 고객 등급 분류
SELECT customer_id, total_spent,
PERCENT_RANK() OVER (ORDER BY total_spent DESC) AS rank_pct
FROM customer_orders;
고객의 총지출 금액을 기준으로 순위를 매기고, 그 백분율을 확인합니다.
5.2 성적에 따른 백분율 분석
SELECT student_id, score,
PERCENT_RANK() OVER (ORDER BY score DESC) AS score_pct
FROM exam_results;
5.3 제품 판매 성과 비교
SELECT product_id, total_sales,
PERCENT_RANK() OVER (ORDER BY total_sales DESC) AS sales_rank_pct
FROM product_sales;
6. CUME_DIST()와의 차이점
항목 | PERCENT_RANK() | CUME_DIST() |
---|---|---|
첫 번째 행 값 | 0 | 1/N |
계산 기준 | (RANK - 1) / (전체 행 수 - 1) | 현재 행 이하의 수 / 전체 행 수 |
동점 처리 | 같은 순위는 같은 백분율 | 같은 값 모두 포함 |
사용 목적 | 순위 기반 구간화 | 누적 분포 확인 |
7. 고급 활용
7.1 상위 20% 고객 추출
SELECT * FROM (
SELECT customer_id, total_spent,
PERCENT_RANK() OVER (ORDER BY total_spent DESC) AS rank_pct
FROM customer_orders
)
WHERE rank_pct <= 0.2;
7.2 등급 부여
SELECT student_id, score,
PERCENT_RANK() OVER (ORDER BY score DESC) AS pct,
CASE
WHEN PERCENT_RANK() OVER (ORDER BY score DESC) <= 0.2 THEN 'A'
WHEN PERCENT_RANK() <= 0.4 THEN 'B'
WHEN PERCENT_RANK() <= 0.6 THEN 'C'
ELSE 'D'
END AS grade
FROM exam_results;
8. 주의사항
- NULL 값은 ORDER BY 시 정렬 기준에 따라 영향을 줍니다.
- 전체 행이 1개일 경우 0이 반환됩니다.
- PARTITION BY는 선택 사항이지만, 실무에서는 그룹별 분석에 유용합니다.
9. FAQ
Q. RANK() 함수와의 차이는?
A. RANK()는 절대 순위, PERCENT_RANK()는 상대 백분율입니다.
Q. 퍼센트 구간을 나눌 수 있나요?
A. 예, CASE WHEN
문을 사용해 등급 구분이 가능합니다.
10. 결론
PERCENT_RANK()는 분석 함수 중에서도 순위 기반의 백분율 분석을 위한 핵심 도구입니다. 고객 등급 분류, 성과 평가, 제품 분석 등 다양한 분야에서 활용되며, CUME_DIST()와 함께 윈도 함수의 강력한 분석력을 제공합니다.
출처
- Oracle 공식 문서: https://docs.oracle.com/en/database/
- Oracle Live SQL: https://livesql.oracle.com
- SQLZoo 및 Stack Overflow 개발자 커뮤니티
- Mode Analytics SQL 튜토리얼
'Database' 카테고리의 다른 글
[ORACLE] NTH_VALUE() 함수로 특정 순위의 값 가져오는 법 (0) | 2025.06.22 |
---|---|
[ORACLE] STATS_MODE() 함수, GROUP BY와 함께 활용하는 방법 (0) | 2025.06.22 |
[ORACLE] ALL_DIM_LEVELS 뷰 완전 분석 (0) | 2025.06.22 |
[ORACLE] ALL_DIM_JOIN_KEY 뷰 완전 분석 (0) | 2025.06.22 |
[ORACLE] ALL_DIM_HIERARCHIES 뷰 완전 정복 (0) | 2025.06.22 |