코드 11-14에서도 emp_hierarchy 테이블을 조회하고, 순위를 반환하는 세 함수를 사용합니다. 세 함수의 PARTITION BY와 ORDER BY 절은 ROW_NUMBER() 함수를 사용했을 때와 같습니다. 부서별로 파티션을 설정하고 급여가 많은 순으로 정렬하죠.
먼저 RANK() 함수는 함수 이름대로 순위를 반환합니다. 결과에서 IT 부서를 보면, RANK() 함수가 반환하는 ranks의 값은 급여가 많은 순서대로 1, 2, 3, 3, 5를 반환했습니다. 여기서 105와 106번 사원의 급여는 4800으로 동일하므로 순위가 3위로 같습니다. 급여가 4200인 107번 사원은 3위가 2명이므로 4위는 건너뛰고 5위가 됩니다.
DENSE_RANK() 함수는 누적 순위를 반환합니다. RANK() 함수와 기본적으로 같은 값을 반환하지만, 동점인 105, 106번은 3위로, 107번은 4위가 됩니다. 3위가 2명이라도 누적 순위라서 5위가 아닌 4위가 됩니다.
마지막으로 PERCENT_RANK() 함수는 비율에 따른 순위로 0에서 1까지의 값을 반환합니다. PERCENT_RANK() 함수의 반환값 계산 식은 (rank – 1) / (rows -1)입니다. 여기서 rank는 RANK() 함수의 반환값이며 rows는 PARTITION BY 절로 지정된 범위의 총 로우 수를 의미합니다. 예를 들어, IT 부서의 103번 사원은 rank가 1이고 rows는 5(IT 부서 인원 5명)이므로 (1 - 1) / (5 - 1) = 0이 됩니다. 104번 사원은 (2 - 1) / (5 - 1) = 0.25이고 105와 106번 사원은 (3 - 1) / (5 - 1) = 0.5가 됩니다. 급여를 기준으로 급여가 가장 많은 103번 사원은 상위 0%에 속하고 104번 사원은 상위 25%, 105와 106번은 상위 50%에 속하는 거죠.
ROW_NUMBER() 함수는 지정된 범위에서 정렬해 로우의 순번을 반환하지만, RANK()와 DENSE_RANK(), PERCENT_RANK() 함수는 순번이 아닌 순위를 반환한다는 점을 기억하세요.