게시일: Dec 12, 2011 11:53:19 PM
- 순위를 산출한 뒤, 이 순위에 대한 분포도를 보여주는 함수이다.
☞ 이 두 함수의 경우 순위를 구할 때는 RANK()가 아닌 DENSE_RANK() 함수의 로직을 사용한다.
- CUME_DIST()
: 계산 대상 값의 그룹(PARTITION BY에 의해 나누어진 그룹) 별로 각 로우를 ORDER BY 절에 명시된 순서대로 정렬한 뒤,
해당 그룹별로 값의 순위에 대한 상대적인 누적 분포도(Cumulative Distribution)를 반환하는데,
0보다 크고 1보다 작거나 같은 범위 (0 < x <= 1)의 값을 반환한다.
- PERCENT_RANK()
: 각각의 로우에 대해 값의 그룹에 따른 순위 퍼센트를 반환하며, 반환값의 범위는 0보다 크거나 같고 1보가 작거나 같다. (0 <= x <=1)
[계산 로직]
반환 값 = (그룹별 로우의 순위 - 1) / (그룹별 전체 로우수 - 1)
select dept
, salary
, dense
, round(cum, 3) cum
, round(per, 3) per
from (select dept
, salary
, DENSE_RANK() OVER (PARTITION BY dept ORDER BY salary) dense
, CUME_DIST() OVER (PARTITION BY dept ORDER BY salary) cum
, PERCENT_RANK() OVER (PARTITION BY dept ORDER BY salary) per
from (
select 10 dept, 100 id, 39000 salary from dual union all
select 20 dept, 101 id, 30000 salary from dual union all
select 20 dept, 102 id, 9000 salary from dual union all
select 20 dept, 103 id, 17000 salary from dual union all
select 20 dept, 104 id, 60000 salary from dual union all
select 20 dept, 105 id, 9500 salary from dual union all
select 20 dept, 106 id, 17000 salary from dual union all
select 20 dept, 107 id, 37500 salary from dual union all
select 20 dept, 108 id, 25000 salary from dual union all
select 30 dept, 109 id, 5000 salary from dual union all
select 40 dept, 110 id, 17000 salary from dual
)
--where dept = 20
)
;
---------------------------------------
DEPT SALARY DENSE CUM PER
---------------------------------------
10 39000 1 1 0
---------------------------------------
20 9000 1 0.125 0
20 9500 2 0.25 0.143
20 17000 3 0.5 0.286
20 17000 3 0.5 0.286
20 25000 4 0.625 0.571
20 30000 5 0.75 0.714
20 37500 6 0.875 0.857
20 60000 7 1 1
---------------------------------------
30 5000 1 1 0
40 17000 1 1 0
---------------------------------------
: 순위를 매길 때는 SALARY 컬럼값을 사용하여 산출하지만 일단 순위를 구하고 난 뒤에는 SALARY 컬럼값이 아닌 순위 값으로 분포도 값을 계산한다.