MySQL
38. MySQL rank 만들기 : count(), rank()
drizzle0925
2021. 11. 10. 16:58
728x90
쿼리를 만들다 보면 순위를 매기고 싶을 때가 있습니다. 그럴 때 유용하게 쓸 수 있는 방법에 대해서 알아봅시다.
math라는 테이블이 있다고 가정하겠습니다. 각 칼럼은 아래의 값을 의미합니다.
id : 테이블 아이디
math_score : 학생들의 수학 점수
name : 학생들의 이름
1. COUNT를 이용해서 만드는 방법
SELECT
id, math_score, name,
( SELECT COUNT(*) + 1 FROM math_socre WHERE math_score > a.math_score ) AS rank
FROM
math AS a
ORDER BY
rank ASC
2. MySQL의 사용자 정의 변수를 이용하여 만드는 방법
MySQL에도 변수와 같은 개념으로 [@변수명]을 이용하여 값을 저장할 수 있습니다. 다만 [@변수명]은 모든 connect에 유효한 값은 아니고, 해당 connect session에서만 유효합니다.
SELECT
id, math_score, name,
( @rank := @rank + 1 ) AS rank
FROM
math AS a,
( SELECT @rank := 0 ) AS b
ORDER BY
a.math_score DESC;
3. rank() 함수
rank() 함수를 이용하면 over() 안에 ORDER BY "랭크를 매길 수치의 컬럼"을 적고 오름차순(ASC)인지 내림차순(DESC)인지 적어주면 됩니다. 위 방법에 비해 간편하죠?
SELECT
id,
math_score,
name,
rank() over(ORDER BY math_score DESC) AS rank
FROM
math;
rank()를 역순으로 하고 싶을 때
dense_rank() 함수를 사용하면됩니다.
SELECT
id,
math_score,
name,
dense_rank() over(ORDER BY math_score DESC) AS rank
FROM
math;
그룹으로 랭크를 매기고 싶을 때
class : 교실이라는 칼럼이 있다고 가정했습니다. 순위를 정하는데 A클래스, B클래스, C클래스 클래스별로 학생들의 수학 성적 순위를 1부터 30까지 매기고 싶을 때 사용하는 것이 [PARTITION BY]라는 옵션입니다. [PARTITION BY] 뒤에는 묶고 싶을 칼럼을 적으시면 됩니다.(SELECT 쿼리로 [GROUP BY]를 사용하고 있다면 [GROUP BY]의 칼럼 값을 적으면 됩니다.)
SELECT
id,
math_score,
name,
class,
dense_rank() over(
PARTITION BY class,
ORDER BY math_score DESC
) AS rank
FROM
math;
728x90