더북(TheBook)

③ CUME_DIST( )와 PERCENT_RANK( )

CUME_DIST 함수는 주어진 그룹에 대한 상대적인 누적분포도 값을 반환한다. 분포도 값(비율)이므로 반환 값의 범위는 0초과 1이하 사이의 값을 반환한다. 부서별 급여에 따른 누적분포도 값을 구해보자.

입력

    SELECT department_id, emp_name,
           salary,
           CUME_DIST() OVER (PARTITION BY department_id
                             ORDER BY salary ) dep_dist
      FROM employees;
그림 7-20 CUME_DIST 함수

10번 부서에서는 총 로우 개수가 한 개이므로 1을, 20번 부서는 로우 개수가 2이므로 급여순으로 0.5와 1을 반환했다. 30번 부서는 총 개수가 6이고 Karen Colmenares는 0.16, Guy Himuro는 0.33을 반환했다. 누적분포 값이므로 30번 부서에서 급여 순으로 Karen이 차지하는 비율은 16%이고, Karen과 Guy가 차지하는 비율은 33%이다. 즉 Guy의 급여 이하를 받는 사원은 30번 부서 전체를 기준으로 33%(2명 / 6명)라는 의미다.

PERCENT_RANK 함수는 해당 그룹 내의 백분위 순위Percentile Rank 를 반환한다. 0초과 1이하의 누적분포 값을 반환하는 CUME_DIST와는 달리, PERCENT_RANK는 0이상 1이하 값을 반환한다. 백분위 순위란 그룹 안에서 해당 로우의 값보다 작은 값의 비율을 말한다. 60번 부서에 대한 CUME_DIST와 PERCENT_RANK 값을 조회해 보자.

입력

    SELECT department_id, emp_name,
           salary
          ,rank() OVER (PARTITION BY department_id
                        ORDER BY salary ) raking
          ,CUME_DIST() OVER (PARTITION BY department_id
                             ORDER BY salary ) cume_dist_value
          ,PERCENT_RANK() OVER (PARTITION BY department_id
                                ORDER BY salary ) percentile
     FROM employees
    WHERE department_id = 60;
그림 7-21 PERCENT_RANK 함수와 CUME_DIST 함수

위 결과를 보면 David과 Valli는 급여가 4,800으로 같아 순위가 2위, 이 두 사원의 급여보다 작은 사람은 1명이므로 백분위 순위(percentile) 값은 25% (¼)가 된다. Bruce의 급여 6,000보다 작은 사원이 총 3명이므로 백분위 순위 값은 75% (¾), Alexander는 100%가 된다. 백분위 순위란 개념 자체가 자신(현재 로우)보다 작은 값의 비율이므로 Alexander 보다 낮은 급여를 받는 비율이 100%라는 뜻은 60번 부서에서 급여가 가장 높음을 의미한다. 마찬가지로 가장 적은 월급을 받는 Diana는 자신보다 낮은 급여를 받는 사람이 없으므로 0%가 되는 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.