Oracle RANK 설명 : 오라클 함수
1. 함수의 목적
Oracle RANK는 그룹내의 값 순위를 구한다.
순위 기준에 대해 동일한 값을 갖는 행은 동일한 순위를 갖는다.
동일한 순위를 갖는 행이 여러개 일 경우, 묶여진 행 수를 추가하여 다음 순위를 계산하기 때문에 순위는 연속적인 숫자가 아닐 수 있다.
이 기능은 TOP-N 및 BOTTOM-N에 유용하다.
2. 샘플을 통한 개념 퀵뷰
hr.employees에서 급여가 $ 15,500이고 수수료가 5 % 인 직원의 순위를 계산한다.
SELECT RANK(15500, .05) WITHIN GROUP
(ORDER BY salary, commission_pct) "Rank"
FROM employees;
Rank
----------
105
3. 사용방법
1) 집계함수
집계 함수로서, RANK는 주어진 ORDER BY 스펙과 관련하여 함수의 인수로 식별된 행의 순위를 계산한다.
함수의 인수는 각 그룹내의 단일행을 식별하기 때문에 각 집계 그룹 내에서 상수 표현식이여야 한다.
상수 인수 표현식과 집계의 ORDER BY 절에있는 표현식은 위치별로 일치해야 한다.
따라서 인수의 수는 같아야하며 형식은 호환 가능해야한다.
2) 분석함수
분석 함수로서 RANK는 order_by_clause를 기반으로 쿼리가 반환한 각 행의 순위를 계산한다
4. 함수 PARAMETER 설명
반환되는 데이터값든 NUMBER 타입이다.
5. 다양한 샘플표현
example1) 다음 쿼리는 직원 급여 중 15,500 달러의 급여에 대한 순위를 반환한다.
SELECT RANK(15500) WITHIN GROUP
(ORDER BY salary DESC) "Rank of 15500"
FROM employees;
Rank of 15500
--------------
4
example2) 급여를 기준으로 부서 60의 직원의 순위를 매 깁니다. 동일한 급여값은 동일한 순위(2)를 받고, 그 다음 순위(4)는 비연속적인 순위를 발생시키는 것에 주의하자.
SELECT department_id, last_name, salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary) RANK
FROM employees WHERE department_id = 60
ORDER BY RANK, last_name;
DENSE_RANK와 비교해 보자.
SELECT department_id, last_name, salary,
DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary) RANK
FROM employees WHERE department_id = 60
ORDER BY RANK, last_name;
결과와 같이 DENSE_RANK는 동일한 순위값 뒤의 숫자가 연속적이다.
이것이 RANK와 DENSE_RANK의 차이점이다.