[Oracle] 오라클 그룹별 랭크 순위 [RANK OVER PARTITION BY | DENSE_RANK 차이]

정우씨 2022. 8. 1. 15:46

[Oracle] 오라클 그룹별 랭크 순위 [RANK OVER PARTITION BY | DENSE_RANK 차이]

 개요

그룹별 순위 데이터가 필요한 상황.

테이블에 여러 학급이 있다면 학급별 학생성적순 RANK 순위가 필요하여 데이터를 추출.

 RANK () OVER

SELECT CLASS,
RANK () OVER ( PARTITION BY CLASS ORDER BY STUDENT_SCORE DESC ) AS RNK
FROM TABLE;

PARTITION BY 다음에 오는 CLASS(반)는 그룹이 될 데이터.

ORDER BY 다음에 STUDENT_SCORE(학생성적)은  순위를 매길 데이터.

학생 성적순으로 순위 데이터를 추출한다.

학생 성적은 높은순으로 높은 순위가 매겨지기 때문에 정렬을 DESC를 사용했지만 상황에 따라 적절하게 사용하면 된다.

만약에 학생성적이 동일하다면 순위는 동일한 순위가 뽑힌다.

 RANK () OVER DATA

CLASS STUDENT_SCORE RNK
1 90 1
1 90 1
1 80 3

위 쿼리로 해당 테이블의 순위를 조회하면 다음과 같이 나온다.

하지만 여기서 학생 데이터에 중복이 있다보니 순위데이터가 1, 1, 3과 같이 나왔다.

1 다음에 2를 출력하려면 DENSE_RANK를 사용한다.

 

 DENSE_RANK() OVER

SELECT CLASS,
DENSE_RANK () OVER ( PARTITION BY CLASS ORDER BY STUDENT_SCORE DESC ) AS RNK
FROM TABLE;

 DENSE_RANK() OVER DATA

CLASS STUDENT_SCORE RNK
1 90 1
1 90 1
1 80 2

 

좋아요♥는 블로그 운영에 큰 도움이 됩니다.