MYSQL에서 RANKING(RANK & ROW_NUMBER) 구현하기
MYSQL에서 RANKING(RANK & ROW_NUMBER) 구현하기
오라클에서 특정값에 대한 RANKING
을 구하는 방법은 너무나 간단하다.
내장 함수 중 RANK
또는 ROW_NUMBER
를 통해서 RANKING
에 대해서 구할 수 있으면 두 함수의 차이는 비교값이 동일할 때 같은 등수를 동일하게 표기할지 아니면 차등을 두고 등수를 부여할지의 차이점을 가지고 있다.
- RANK() : 비교값이 동일할 경우 같은 등수(RANK)를 부여
- ROW_NUMBER() : 비교값이 동일할 같은 차등 등수(RANK)를 부여
ORACLE – RANK()
1
2
3
SELECT COLUMN1, COLUMN2, COLUMN3
,RANK() OVER(ORDER BY SORT_COLUMN DESC) AS RANKING
FROM TMP_TABLE
ORACLE – ROW_NUMBER()
1
2
3
SELECT COLUMN1, COLUMN2, COLUMN3
,ROW_NUMBER() OVER(ORDER BY SORT_COLUMN DESC) AS RANKING
FROM TMP_TABLE
그렇다면 MYSQL
에서는 내장 함수가 없기 때문에 개발자가 직접 구현을 해야 한다.
MYSQL – RANK()
1
2
3
4
5
SELECT COLUMN1, COLUMN2, COLUMN3
,@RANKT := IF(@LAST > SORT_COLUMN, @RANK := @RANK + 1, @RANK) AS RANKING
,@LAST := SORT_COLUMN
FROM TMP_TABLE, (SELECT @RANK := 0) XX
ORDER BY SORT_COLUMN DESC
다음처럼 구현을 하면 ROW_NUMBER()
가 아닌 RANK()
함수와 동일한 결과를 반환합니다.
동일한 값을 구하기 위해서 @LAST
변수를 선언하여 해당 비교값이 동일한 경우에는 해당 등수를 반환하여 동일한 등수를 부여 할 수 있도록 정의한다.
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
다음처럼 구현을 하면 RANK()
가 아닌 ROW_NUMBER()
함수와 동일한 결과를 반환합니다.
정렬을 기준으로 무조건 등수를 증분시켜서 비교값이 동일한 경우에도 등수의 차등을 줄 수 있도록 정의하였다.
전체적으로 주의할 점은 @RANK
값이 맨 마지막에 나와야지 해당 값의 정렬이 제대로 적용된다.
This post is licensed under
CC BY 4.0
by the author.