송민준의 개발노트
Oracle 순위 함수(Rank) 사용법~!!! 본문
순위 함수의 목적은 어떤 항목이나 파티션에 대해서 순위를 계산하는 함수이다~!
우선 랭크 함수의 종류는
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 |