본문 바로가기

데이터베이스

Rank 함수

뭔가 어떤 결과에 대해 순위를 매기고 싶을때가 있다. Rank함수가 이럴때 사용되는 함수이다.

Rank함수는 어떤 결과집합의 전체 혹은 그 안에 일부 그룹들 내에서의 각 행에 대해 순서를 계산하여 매겨준다.

 

순서를 매길때 같은 값이 있다면 동일한 순위를 부여받는다. 순위의 시작은 1부터이고 공동 2위가 2개면 다음 행은 4위가 된다. 즉 연속적으로 1,2,3,4,5로 순위가 매겨지지 않을 수 있다. 

 

Syntax

 

Rank() Over(

    [Partition By Partition_Expression, ....]

    Order by Sort_Expression [Asc | Desc], ....

)

 

Partition by절은 결과집합에서 순위를 매기는 그룹을 나누어 준다. 예를 들어 학교에서 성적 순위를 매긴다고 하자. 1학년은 1반 ~ 5반까지 있다. 그럼 1학년 전체에서 성적순으로 순위를 매길수도 있고 반별로 순위를 매길수도 있다. 이때 Partition By를 적절히 잘 활용하면 된다. 

 

Order by절은 순위를 매기는 그룹내에서 행들간에 논리적 정렬을 해준다. 이렇게 정렬을 시켜 놓고 순위를 매기는 것이다. 

 

select Volume
     , RANK() over(Order by Volume asc) as RANKING
from STOCKS
where STOCK_NM = 'VOOG'

 

순위결과

위의 예로든 코드는 어떤 펀드 조회결과를 거래량의 오르차순으로 정렬하여 순위를 매긴 것이다. 이때 보면 Partition by가 없다. 이 말인 즉슨 테이블에 들어 있는 모든 값을 하나의 그룹으로 보고 순서를 매기는 것이다. 

 

또 거래량이 많았던 순서로 하고 싶으면 Volume 뒷부분에 asc를 desc로 바꾸면 된다. 

 

다른 예를 보자.

 

select Volume
     , year([Date]) as YY
     , RANK() over(Partition by year([Date]) 
               Order by Volume desc) as RANKING
from STOCKS
where STOCK_NM = 'VOOG'

 

이번에는 Partiton by를 넣었다. 연도별로 잘라서 보기로 했다. 그래서 Year라는 함수를 사용하여 거래일자에서 연도만 추려내었다. 그러니 결과는 아래처럼 년도별로 묶인 결과별로 순위가 매겨진것을 볼 수 있다.  

 

Parttion by를 사용한 결과

이번에는 1위에서 3위까지만 보고 싶을때이다. 

 

with rankCTE as (
select Volume
 , year([Date]) as YY
 , RANK() over(Partition by year([Date]) 
   Order by Volume desc) as RANKING
from STOCKS
where STOCK_NM = 'VOOG'
) select *
  from rankCTE 
  where RANKING <= 3;

 

1부터 3위까지 결과

먼저 연도별 순위를 매긴 결과에 다시 한번 3위까지 만의 조건을 걸어서 조회하였다.