전체등수 매길때 :
rank() over (order by 구하고자하는컬럼 desc)
~별로 등수를 매길때:
rank() over(partition by ~별 order by 구하고자하는컬럼 desc)
-- employees 테이블에서 기본급여에 대해 전체등수 및 부서내등수를 구하세요.
select
rank() over(order by salary desc) as 전체등수,
rank() over(partition by department_id order by salary) as 부서내등수
from employees;
순위 함수의 순위는 OVER 함수 내부의 ORDER BY 컬럼 값으로 결정된다.
RANK() : 중복 순위 개수만큼 다음 순위 값을 증가 시킴. 등수구하기
DENSE_RANK() : 중복 순위가 존재해도 순차적으로 다음 순위 값을 표시함. 서열구하기
=> inline view 를 이용하여 사용
SELECT employee_id AS 사원번호
, first_name || ' ' || last_name AS 사원명
, nvl(salary + (salary * commission_pct), salary) AS 월급
, rank() over (order by nvl(salary + (salary * commission_pct), salary) desc) AS 월급등수
FROM employees
WHERE rank() over (order by nvl(salary + (salary * commission_pct), salary) desc) <= 10;
-- ORA-30483 : 윈도우 함수를 여기에 사용할 수 없습니다
-- 오류이다. !! 왜냐하면 rank() 함수와 dense_rank() 함수는 where절에 막바로 쓸수가 없습니다.
-- !!!!!!!!!!!!!!!!!!!!!!!!!!! 이럴때 인라인 뷰를 사용하면 된다. !!!!!!!!!!!!!
SELECT
employee_id AS 사원번호,
FULLNAME AS 사원명,
to_char(MONTHSAL, '99,999') AS 월급,
MONTHSAL_RANK AS 등수
FROM
(
SELECT employee_id
, first_name || ' ' || last_name AS FULLNAME
, nvl(salary + (salary * commission_pct), salary) AS MONTHSAL
, rank() over (order by nvl(salary + (salary * commission_pct), salary) desc) AS MONTHSAL_RANK
FROM employees
) V;