[오라클] RANK() 사용법

심심이·2024년 2월 24일
0

oracle

목록 보기
12/40
  • 전체등수 매길때 :
    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() : 중복 순위가 존재해도 순차적으로 다음 순위 값을 표시함. 서열구하기


rank(), dense_rank() 는 where 절에 사용할 수 없다

=> 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;
profile
개발하는 심심이

0개의 댓글