본문 바로가기
Develops/SQL

[ORACLE] RANK, DENSE_RANK, ROW_NUMBER 함수 (중복여부, 생략여부)

by SLOTH91 2024. 3. 30.
반응형

RANK(), DENSE_RANK(), ROW_NUMBER() 모두 윈도우 함수 내에 있는 순위 함수이다.

기본적으로 세 함수 모두 순위를 구하는 함수이지만, 약간의 특징적 차이가 있으므로 알아보자.

 

간단 요약

함수명 설 명
RANK() 여러 행의 값이 같은 경우라면 같은 순위를 부여
공동 순위를 부여하고 그 다음 나오는 행에는 같은 순위가 나왔던 숫자만큼 건너 뛰고 순위를 부여
DENSE_RANK() 여러 행의 값이 같은 경우라면 같은 순위를 부여
공동 순위를 부여하고 그 다음 나오는 행에는 순위를 건너뛰지 않고 이어서 순위를 부여
ROW_NUMBER() 각 행에 순위를 부여할 때 동점인 경우가 있어도 이를 무시하고 연속적인 순위를 부여

 

 

RANK()

  • 순위 함수 중에서도 일반적으로 가장 많이 사용하는 함수
  • 여러 행의 값이 같은 경우라면 같은 순위를 부여해주는 방식이며, 공동 순위를 부여하고 그 다음 나오는 행에는 같은 순위가 나왔던 숫자만큼 건너 뛰고 순위를 부여
  • 윈도우 함수이므로 OVER() 연결되는 구조로 문법이 사용
SELECT *
     , RANK() OVER(ORDER BY `홈런` DESC) AS 'RANK'
  FROM KBO_HR
이름 포지션 홈런 RANK
이승엽 내야수 467 1
최정 내야수 403 2
이대호 내야수 351 3
양준혁 지명타자 351 3
최형우 외야수 342 5
장종훈 내야수 340 6
이호준 내야수 337 7

 

 

DENSE_RANK()

  • 같은 값이 나오는 행에 동일한 순위를 부여해준다는 점에서는 RANK() 함수와 동일
  • 동일한 순위 부여한 후 다음에 나오는 행에는 순위를 건너뛰지 않고 이어서 순위를 부여
SELECT *
     , DENSE_RANK() OVER(ORDER BY `홈런` DESC) AS 'RANK'
  FROM KBO_HR
이름 포지션 홈런 RANK
이승엽 내야수 467 1
최정 내야수 403 2
이대호 내야수 351 3
양준혁 지명타자 351 3
최형우 외야수 342 4
장종훈 내야수 340 5
이호준 내야수 337 6

 

 

ROW_NUMBER()

  • 각 행에 순위를 부여할 때 동점인 경우에도 이를 무시하고 연속적인 순위를 부여
SELECT *
     , ROW_NUMBER() OVER(ORDER BY `홈런` DESC) AS 'RANK'
  FROM KBO_HR
이름 포지션 홈런 RANK
이승엽 내야수 467 1
최정 내야수 403 2
이대호 내야수 351 3
양준혁 지명타자 351 4
최형우 외야수 342 5
장종훈 내야수 340 6
이호준 내야수 337 7

 

 

RANK() vs DENSE_RANK() vs ROW_NUMBER()

이름 포지션 홈런 RANK DENSE_RANK ROW_NUMBER
이승엽 내야수 467 1 1 1
최정 내야수 403 2 2 2
이대호 내야수 351 3 3 3
양준혁 지명타자 351 3 3 4
최형우 외야수 342 5 4 5
장종훈 내야수 340 6 5 6
이호준 내야수 337 7 6 7

 

 

 

 

[참고]

https://data-kindergarten.tistory.com/44

 

반응형