송민준의 개발노트

Oracle 순위 함수(Rank) 사용법~!!! 본문

DB/쿼리

Oracle 순위 함수(Rank) 사용법~!!!

송민준 2020. 8. 6. 00:12

순위 함수의 목적은 어떤 항목이나 파티션에 대해서 순위를 계산하는 함수이다~!

 

우선 랭크 함수의 종류는

1. RANK : 특정항목 및 파티션에 대해 순위를 계산한다. 만약 값이 같다면 순위 또한 같게 주어진다.

2. DENSE_RANK : 같은 순위일 경우 하나의 건수로 계산을 한다.

3. ROW_NUMBER : 같은 순위일 경우에도 고유의 순위를 부여한다. 

 

위 3가지가 존재한다. 목적에 따라 사용하면 된다.

1. Partition by 사용에 따른 결과 비교

select ename, sal, rank() over (order by sal desc) all_rank,
       rank() over (partition by job order by sal desc) job_rank
from emp;

위 쿼리를 실행하면 아래와 같이 결과가 나온다.

보면 값이 같을 경우 같은 순위로 주는 것을 볼 수 있다.

1) partition이 없을 경우 중복되는 rank 3은 안보여준다.

바로 4로 넘어가는 것을 볼 수 있다.

2) partition으로 그룹을 주면 직무별 순위를 보여주고 중복되는 건  같은 순위로 보여주되 안보여주는 건 없다.

 

2. DENSE 적용 여부에 따른 결과 비교

select ename, sal, rank() over (order by sal desc) all_rank,
       rank() over (partition by job order by sal desc) job_rank,
       dense_rank() over (order by sal desc) dense_rank,
       dense_rank() over (partition by job order by sal desc) dense_job_rank
from emp;

위 쿼리를 실행하면 아래와 같은 결과가 나온다.

 

partition 의 경우 그룹화를 하기 때문에 dense이건 아니건 값은 동일하다.

반면 partition이 없는 것을 기준으로 dense는 중복 순위 다음 값이 생략이 안되고 이어서 나온다.

( 2등 -> 3등)

 

3. ROW_NUMBER 사용에 따른 비교

select ename, sal, rank() over (order by sal desc) all_rank,
       rank() over (partition by job order by sal desc) job_rank,
       dense_rank() over (order by sal desc) dense_rank,
       dense_rank() over (partition by job order by sal desc) dense_job_rank,
       row_number() over (order by sal desc) row_num
from emp;

위 쿼리를 실행하면 아래의 결과가 나온다.

보면 sal 에 대한 순서대로 나와 있다고 보면 된다. 중복값이 없는 것이 특징이다. ( 순서구할때 많이 씀)

 

추가적으로 rownum 을 사용해서 조회 결과에서 원하는 번호까지 뽑아내는게 있다.

select *
from (
         select ename,
                sal,
                row_number() over (order by sal desc)                  row_num
         from emp)
where row_num < 5;

위 쿼리는 row_number를 활용해서 뽑은 번호를 기준으로 4등 안에 들은 사람을 뽑는 것이다.

 

다른 방법으로

select *
from (
         select ename,
                sal
         from emp
        order by sal desc)
where rownum < 5;

 

위와 같이 실행하는 것도 있다.

성능 또한 별 차이가 없다.

 

만약 아래와 같이 적용하면 어떻게 될까? 뭔가 정렬된 상태에서 상위 4등까지 나올 것 같은가?

select ename,
       sal
from emp
where ROWNUM < 5
order by sal desc;

결과는 아래와 같다.

그렇다 원 emp에서 순서대로 4등까지 뽑고(삽입 기준) 정렬을 한다;

'DB > 쿼리' 카테고리의 다른 글

Oracle 비율 함수  (0) 2020.08.11
Oracle 행 함수  (0) 2020.08.09
oracle 개행 넣기  (0) 2020.08.05
(oracle) 다른 테이블 값 참조해서 update 해주기  (0) 2020.08.04
(Oracle)윈도우 함수 사용법  (0) 2020.08.03