본문 바로가기
Database

[ORACLE] PERCENTRANK() 함수로 누적 백분위 구하는 방법

by Engineer J 2025. 6. 22.

오라클 PERCENT_RANK() 함수로 누적 백분위 구하는 방법
Oracle PERCENT_RANK()

 

 

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()와 함께 윈도 함수의 강력한 분석력을 제공합니다.

출처