뭔가 어떤 결과에 대해 순위를 매기고 싶을때가 있다. 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라는 함수를 사용하여 거래일자에서 연도만 추려내었다. 그러니 결과는 아래처럼 년도별로 묶인 결과별로 순위가 매겨진것을 볼 수 있다.
이번에는 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;
먼저 연도별 순위를 매긴 결과에 다시 한번 3위까지 만의 조건을 걸어서 조회하였다.
'데이터베이스' 카테고리의 다른 글
공통테이블식 CTE(Common Table Expression) (0) | 2020.07.16 |
---|---|
Information Engineering Notification(IE 표기법) (0) | 2020.07.15 |
Pivot (0) | 2020.07.11 |
순환적 관계(Recursive Relationship) (0) | 2020.07.10 |
참여 제약 조건(Participation Constraints) (0) | 2020.07.09 |