오라클(oracle) rank(), row_number() 순위함수 사용 예제 :: 개발/일상_Mr.lee

오라클(oracle) rank(), row_number() 순위함수 사용 예제

Posted by Mr.mandu.
2019. 11. 13. 11:28 개발/DB

안녕하세요.

오늘은 오라클 함수에 대해 설명하고자 합니다.

오라클 뿐만 아니라 mssql에서도 사용이 가능 합니다.

mysql, postgre 등의 다른 DB는 확인해보셔야 할 것 같습니다.


순위를 뽑아내는 rank() 함수에 대해 알아보겠습니다.

이런 함수는 알아둬야 나중에 검색이라도 해서 활용 할 수 있습니다.


기본 랭크 함수입니다.

구분을 위해 쿼리는 파란 네모 표시로 하겠습니다.


rank() 함수

select sno, cost, rank() over(order by nvl(cost,0) desc) rank from pt_02;

<결과>

cost가 null값이면 0으로 처리하였습니다.

또한 내림차순으로 정렬하였습니다.

rank 출력문을 보시면 1,2,3,4,5,5,7 로 출력되는것을 볼 수 있는데

cost 값이 500으로 똑같기 때문입니다.

여기서 순위가 7이 아닌 6으로 처리하기위한 함수가 있는데

dense_rank() 입니다.


dense_rank() 함수

select sno, cost, dense_rank() over(order by nvl(cost,0) desc) rank from pt_02;

<결과>

rank 출력문을 보시면 1,2,3,4,5,5,6 으로 출력된 모습을 확인 할 수 있습니다.


이번에는 지역별(분류) 순위를 출력해 보겠습니다.

지역별 가격 순위

select 

sno, no, count, cost, location,

rank() over(PARTITION by location order by  nvl(cost,0) desc ) as rank

from pt_02;

<결과>

'partition by 컬럼' 을 통해 지역별 순위를 출력하였습니다.

 위의 결과를 보시면 4순위가 2개로 출력됩니다.


구분을 주기위하여 sno 번호로 정렬을 한번더 주겠습니다.

select 

sno, no, count, cost, location,

rank() over(PARTITION by location order by  nvl(cost,0) desc, sno desc ) as rank

from pt_02;

<결과>

sno로 정렬을 주어 동일 순위를 제거하였습니다.


rank 기능과 유사하게 사용할 수 있는 row_number()가 있습니다.

row_number()는 따로 순위를 매긴다기보다 순번을 정한다는 개념입니다.

rowId와 비슷합니다.


row_number()

select 

sno, no, count, cost, location,

row_number() over( order by  nvl(cost,0) desc ) as rank

from pt_02;

<결과>


row_number()도 partition by 를 사용하여 지역별 순번을 할당 할 수 있습니다.

select 

sno, no, count, cost, location,

row_number() over( partition by location  order by  nvl(cost,0) desc ) as rank

from pt_02;

<결과>


이러한 함수들을 익히기위해 

실습을 통해 포스팅 할 예정입니다.

감사합니다.