본문 바로가기
프로그래밍/DBMS

MYSQL 그룹별 RANK함수 구현하기

by zoo10 2021. 3. 16.

요구사항

  • 2020년1월~2021년 현재까지
  • 주문상태는 결제완료
  • 상점코드별 월단위 판매금액 순 100위까지의 고객의 정보를 추출
  • 판매금액이 동일할 경우 같은 등수로 처리
  • 추출정보 : 상점코드, 년월, 고객명, 판매금액, 판매수량

환경 : AWS ARORA DB

문제 : RANK() 함수가 지원되지 않아 직접 구현해야 함

SELECT
	*
FROM (
         SELECT A.*
              , CASE @SHOP WHEN SHOP_NO THEN
                    CASE @MON WHEN MON THEN
                        IF(@SALE_AMT > SALE_AMT, @RANK := @RANK + 1, @RANK)
                    ELSE
                        @RANK := 1
                    END
                  ELSE
                    @RANK := 1
                END AS RNK
              , @SHOP := SHOP_NO
              , @MON := MON
              , @SALE_AMT := SALE_AMT
         FROM (
                  SELECT A.상점코드 AS SHOP_NO
                       , DATE_FORMAT(A.주문일시, '%Y-%m') AS MON
                       , C.유저명 AS USER_NM
                       , SUM(A.판매금액)         AS SALE_AMT
                       , SUM(B.판매수량)         AS SALE_QTY
                  FROM 판매테이블 A
                           JOIN 판매상세테이블 B
                                ON A.판매번호 = B.판매번호
                           LEFT OUTER JOIN 유저테이블 C
                                           ON A.유저번호 = C.유저번호
                  WHERE A.주문상태 = '결제완료'
                    AND A.주문일시 >= '2020-01-01'
                    AND A.주문일시 < '2021-12-31'
                  GROUP BY A.상점코드, DATE_FORMAT(A.주문일시, '%Y-%m'), A.유저번호
              ) A
		 CROSS JOIN (SELECT @RANK := 0, @SHOP:=0, @MON:='', @SALE_AMT := 0) B
         ORDER BY SHOP_NO, MON, SALE_AMT DESC
     ) A
WHERE SALE_AMT >0 AND RNK <= 100

 

MYSQL 8.0 이상부터는 RANK() 함수를 지원하니 그냥 작성하면 됨