MYSQL에서 그룹별 RANKING 구하기
MYSQL에서 그룹별 RANKING 구하기
RANKING
을 구할 때 공부를 위해서는 특정값을 기준으로 구하면 되지만 실제 업무를 하다보면 특정값을 기준으로 하되 그룹별로 RANKING
을 구해야 하는 경우가 태반이다.
ORACLE에서는 간단하게 RANKING
관련 내장 함수와 PARTITION BY
를 사용하면 쉽게 구현할 수 있다.
ORACLE – PARTITION BY
1
2
3
SELECT COLUMN1, COLUMN2, COLUMN3
,ROW_NUMBER() OVER(PARTITION BY GROUP_COLUMN ORDER BY SORT_COLUMN DESC) AS RANKING
FROM TMP_TABLE
하지만 MYSQL은 개발자가 직접 구현을 해줘야 한다.
그래서 지난번에 작성했던 MYSQL에서 RANKING(RANK & ROW_NUMBER) 구현하기에서 추가적으로 그룹핑을 해서 RANKING
을 구하는 방법을 설명하고 그룹핑 설명은 ROW_NUMBER()
의 RANKING
을 기준으로 설명한다.
MYSQL – ROW_NUMBER()
1
2
3
4
SELECT COLUMN1, COLUMN2, COLUMN3
,@RANKT := @RANK + 1 AS RANKING
FROM TMP_TABLE, (SELECT @RANK := 0) XX
ORDER BY SORT_COLUMN DESC
다음 쿼리는 ROW_NUMBER()
를 구하는 쿼리에 추가적으로 그룹핑할 컬럼을 정의하고 해당 컬럼을 기준으로 RANKING
을 변경하도록 한다.
MYSQL – GROUP ROW_NUMBER()
1
2
3
4
5
SELECT COLUMN1, COLUMN2, COLUMN3
,CASE @GROUPING WHEN GROUP_COLUMN THEN @RANKT := @RANK + 1 ELSE @RANK := 1 END AS RANKING
,@GROUPING := GROUP_COLUMN
FROM TMP_TABLE, (SELECT @GROUPING := '', @RANK := 0) XX
ORDER BY SORT_COLUMN DESC
RANKING
방식으로 구현을 하고 싶다면 @RANK
에 대한 값을 계산하는 부분에 IF
구문과 @LAST
변수를 활용하면 된다.
This post is licensed under
CC BY 4.0
by the author.