더북(TheBook)

② RANK( ), DENSE_RANK( )

RANK 함수는 파티션별 순위를 반환한다. 부서별로 급여 순위를 매겨 보자.

입력

    SELECT department_id, emp_name,
           salary,
           RANK() OVER (PARTITION BY department_id
                        ORDER BY salary ) dep_rank
      FROM employees;
그림 7-17 RANK 함수

dep_rank 컬럼에서 부서별로 급여에 따라(ORDER BY salary) 순위가 매겨진 것이 보인다. 50번 부서에서 동일한 급여를 받는 사원은 동일한 순위가 반환됐는데(2위) 그 다음 순위는 한 번 건너뛰어(4위) 매겨졌다는 점에 유의하자. 만약 2위가 3명이라면 다음 순위는 5위가 될 것이다.

DENSE_RANK 함수는 RANK와 비슷하지만 같은 순위가 나오면 다음 순위가 한 번 건너뛰지 않고 매겨진다.

입력

    SELECT department_id, emp_name,
           salary,
           DENSE_RANK() OVER (PARTITION BY department_id
                              ORDER BY salary ) dep_rank
      FROM employees;
그림 7-18 DENSE_RANK 함수

위 결과를 보면 50번 부서에서 동일 순위인 2위 다음 순번이 4위가 아닌 3위로 반환됐음을 확인할 수 있다.

분석 함수는 응용 분야가 매우 많다. 예를 들어, 특정 조건에 맞는 상위 혹은 하위 n개의 데이터만 추출하는 TOP n 쿼리도 쉽게 작성할 수 있다. 각 부서별로 급여가 상위 3위까지인 사원을 추출하는 쿼리를 작성해 보자.

입력

    SELECT *
    FROM ( SELECT department_id, emp_name,
                  salary,
                  DENSE_RANK() OVER (PARTITION BY department_id
                                     ORDER BY salary desc) dep_rank
             FROM employees
         )
    WHERE dep_rank <= 3;
그림 7-19 TOP n 쿼리

급여가 높은 순서대로 순위를 매겨야 하므로 ORDER BY 절에서 내림차순으로 정렬시켰고, 서브 쿼리를 사용해 분석 함수 컬럼인 dep_rank 값이 3이하인 건을 걸러 냈다.

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