본문으로 바로가기

MySQL rank 함수

category 데이터베이스 2020. 8. 4. 11:46

MySQL 8 버전부터는 rank 함수를 지원한다.

이전 버전에서는 계산하는 쿼리를 만들어야 하는데 몇가지 방법이 있는 것 같다.

 

1. COUNT 를 이용해서 만드는 방법

SELECT
    ranking_no, ranking_score, ranking_name,
    ( SELECT COUNT(*) + 1 FROM ranking WHERE ranking_score > b.ranking_score ) AS rank
FROM
    ranking_score AS b
ORDER BY
    rank ASC

 

이 방식은 모든 로우 별로 Sub Query SELECT 문을 실행하기 때문에 많은 데이터가 존재할 경우 성능 저하 문제가 생긴다.

 

2. MySQL 의 사용자 정의 변수를 이용하여 만드는 방법

SELECT
    ranking_no, ranking_score, ranking_name,
    ( @rank := @rank + 1 ) AS rank
FROM
    ranking AS a,
    ( SELECT @rank := 0 ) AS b
ORDER BY
    a.ranking_score DESC;

MySQL 에도 프로그램의 변수와 같은 개념으로 @변수명을 이용해 값을 유지할 수 있다.

다만 "@변수명" 은 모든 connect 에 유효한 값이 아니고, 해당 connect session 에서만 유효한 값이다.

 

 

 

 

8버전부터 지원하는 rank 함수를 살펴보자

- rank()

SELECT *, rank() over(order by Population desc) AS ranking
FROM city;

 

위 쿼리는 city 테이블에서 Population 내림차순으로 랭킹을 매겨라는 쿼리이다.

rank() 함수 실행 결과를 보면, Population 22000인 로우 2개의 ranking은 4021이고

다음 ranking은 4023으로 나오는걸 볼 수 있다.

 

- dense_rank()

SELECT *, dense_rank() over(order by Population desc) AS ranking
FROM city;

 

이와 다르게 dense_rank() 함수는 ranking 2530인 로우가 2개 이지만 다음 ranking을 살펴보면 2531로 나오는걸 볼 수 있다.