날짜별 글 목록: 2018년 12월 4일

MYSQL에서 그룹별 RANKING 구하기

RANKING을 구할 때 공부를 위해서는 특정값을 기준으로 구하면 되지만 실제 업무를 하다보면 특정값을 기준으로 하되 그룹별로 RANKING을 구해야 하는 경우가 태반이다.

ORACLE에서는 간단하게 RANKING관련 내장 함수와 PARTITION BY를 사용하면 쉽게 구현할 수 있다.

ORACLE – PARTITION BY

하지만 MYSQL은 개발자가 직접 구현을 해줘야 한다.
그래서 지난번에 작성했던 MYSQL에서 RANKING(RANK & ROW_NUMBER) 구현하기에서 추가적으로 그룹핑을 해서 RANKING을 구하는 방법을 설명하고 그룹핑 설명은 ROW_NUMBER()RANKING을 기준으로 설명한다.

MYSQL – ROW_NUMBER()

다음 쿼리는 ROW_NUMBER()를 구하는 쿼리에 추가적으로 그룹핑할 컬럼을 정의하고 해당 컬럼을 기준으로 RANKING을 변경하도록 한다.

MYSQL – GROUP ROW_NUMBER()

RANKING 방식으로 구현을 하고 싶다면 @RANK에 대한 값을 계산하는 부분에 IF 구문과 @LAST 변수를 활용하면 된다.

MYSQL에서 RANKING(RANK & ROW_NUMBER) 구현하기

오라클에서 특정값에 대한 RANKING을 구하는 방법은 너무나 간단하다.
내장 함수 중 RANK 또는 ROW_NUMBER를 통해서 RANKING에 대해서 구할 수 있으면 두 함수의 차이는 비교값이 동일할 때 같은 등수를 동일하게 표기할지 아니면 차등을 두고 등수를 부여할지의 차이점을 가지고 있다.

  • RANK() : 비교값이 동일할 경우 같은 등수(RANK)를 부여
  • ROW_NUMBER() : 비교값이 동일할 같은 차등 등수(RANK)를 부여

ORACLE – RANK()

ORACLE – ROW_NUMBER()

그렇다면 MYSQL에서는 내장 함수가 없기 때문에 개발자가 직접 구현을 해야 한다.

MYSQL – RANK()

다음처럼 구현을 하면 ROW_NUMBER()가 아닌 RANK() 함수와 동일한 결과를 반환합니다.
동일한 값을 구하기 위해서 @LAST 변수를 선언하여 해당 비교값이 동일한 경우에는 해당 등수를 반환하여 동일한 등수를 부여 할 수 있도록 정의한다.

MYSQL – ROW_NUMBER()

다음처럼 구현을 하면 RANK()가 아닌 ROW_NUMBER() 함수와 동일한 결과를 반환합니다.
정렬을 기준으로 무조건 등수를 증분시켜서 비교값이 동일한 경우에도 등수의 차등을 줄 수 있도록 정의하였다.

전체적으로 주의할 점은 @RANK 값이 맨 마지막에 나와야지 해당 값의 정렬이 제대로 적용된다.