본문 바로가기
IT/MYSQL

MYSQL - RANK / DENSE_RANK / ROW_NUMBER 함수로 순위 쉽게 구하기

by 꿀코 2023. 2. 24.
반응형

MYSQL에서 지원하는 윈도우함수 중 RANK(), DENSE_RANK(), ROW_NUMBER() 함수를 사용하여 순위를 쉽게 구할 수 있습니다. MYSQL 5 버전까지만 해도 순위를 구하기 위해서 사용자 정의 변수를 활용하여 복잡하게 쿼리를 구성했어야 했는데, 8 버전 이상부터는 위의 3가지 함수를 활용하여 쉽게 순위를 구할 수 있게 되었습니다. 그럼 각각의 함수가 어떤 특징을 가지는지 알아보겠습니다.

 

 

RANK / DENSE_RANK / ROW_NUMBER 함수 특징

 RANK()

RANK() 함수의 특징은 중복이 가능하며, 순위가 같은 행이 여러 행이 있을 경우 같은 순위의 수만큼 건너뛰고 다음 순위를 계산합니다.

 

 DENSE_RANK()

DENSE_RANK() 함수의 특징은 중복이 가능하며, 순위가 같은 행이 여러 행이 있을 경우에도 다음 순위는 같은 순위의 수만큼 건너뛰지 않고 순차적으로 다음 순위를 계산합니다.

 

▶ ROW_NUMBER()

ROW_NUMBER() 함수의 특징은 중복이 없고, 단순히 행번호를 순차적으로 계산합니다.

 

함수 특징
RANK() 공동 순위만큼 건너뜀 (예시 : 1,2,2,4,5)
DENSE_RANK() 공동 순위만큼 건너뛰지 않음 (예시 : 1,2,2,3,4)
ROW_NUMBER() 중복 없는 순위 (예시 : 1,2,3,4,5)

 

 

각 함수별 비교 예시

RANK(), DENSE_RANK(), ROW_NUMBER() 함수가 순위를 구하거나 번호를 붙일 때 사용되기 때문에 각각 비슷한 성격을 가지고 있습니다. 따라서 다음의 예시를 통하여 각 함수별로 실제 쿼리를 작성해 보겠습니다.

※ 순위 함수들은 문법적으로 순위함수() OVER(ORDER BY 필드)로 쿼리를 사용합니다.

 

 - 쿼리

SELECT ID, NAME, DEPT, SALARY,
-- 순위 : 중복 O, 건너뛰기 O
RANK() OVER(ORDER BY SALARY) 'RANK',
-- 순위 : 중복 O, 건너뛰기 X
DENSE_RANK() OVER(ORDER BY SALARY) 'DENSE_RANK',
-- 순위 : 행번호
ROW_NUMBER() OVER(ORDER BY SALARY) 'ROW_NUMBER'
FROM SALARY

 - 결과

순위쿼리결과
순위 함수 결과

 

 

그룹별 순위 - PARTITION BY

데이터의 순위를 구하다 보면 그룹을 지어 순위를 구해야 하는 경우도 생길 수 있습니다. 이럴 경우에는 OVER() 안에 PARTITION BY를 주어 그룹을 만들고 그 안에서 순위를 구할 수 있습니다.

 

 - 쿼리

# 그룹 내 순위 구하기
SELECT ID, NAME, DEPT, SALARY,
RANK() OVER(PARTITION BY DEPT ORDER BY SALARY) 'RANK'
FROM SALARY

 - 결과

그룹쿼리결과
그룹 내 순위 결과

 

반응형

댓글