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
'MySQL' 카테고리의 다른 글
40. MySQL AUTO_INCREMENT 재 정렬하기 (0) | 2021.11.17 |
---|---|
39. MySQL AUTO_INCREMENT 값 확인하기, 값 받아오기 (0) | 2021.11.17 |
37. MySQL MariaDB 백업 & 복원하기 (0) | 2021.10.29 |
36. MySQL - mariaDB(Linux) 시작, 종료 재시작 (0) | 2021.10.29 |
35. MySQL auto_increment 확인 (0) | 2021.10.14 |