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로 나오는걸 볼 수 있다.
'데이터베이스' 카테고리의 다른 글
Outer Join 시 데이터 없을 경우 Count를 0 처리하는 방법 (1) | 2020.09.25 |
---|---|
ERD 관계 해석해보기 (0) | 2019.06.16 |
식별관계, 비식별관계 (0) | 2019.05.02 |
Mysql 5.7 이후 버전 비밀번호 변경 방법 (0) | 2018.12.24 |
데이터베이스 릴레이션 키 정리 (0) | 2018.11.30 |