꿈은 데이터분석가, 취미는 계획

[MY SQL] DENSE_RANK를 활용하여 리뷰를 가장 많이 작성한 회원의 리뷰 조회 본문

SQL/sql문풀

[MY SQL] DENSE_RANK를 활용하여 리뷰를 가장 많이 작성한 회원의 리뷰 조회

data_2080 2024. 4. 27. 13:50
728x90

출처: [프로그래머스 스쿨 - 코딩테스트 연습 - MY SQL 문제] :  그룹별 조건에 맞는 식당 목록 출력하기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/131124


문제(일부):  고객정보 테이블과 고객리뷰테이블에서 주문이 가장 많은 회원의 리뷰정보 불러오기


윈도우 함수 PERCENT_RANK활용하기

0) 최대리뷰 수가 같은 회원이 있을 것이라고 예상 => 조회 시 최대리뷰 작성자가 3명 출력

1) 작성자별 리뷰 수 count를 위한 with절 생성
    필터링을 위해 DENSE_RANK 윈도우함수를 사용하여 리뷰수가 많은 순으로 등급부여
    * 순위가 동일할 경우 같은 순위 부여
       ex) 3,3,3,2,2,1 => 1등,1등,1등,2등,2등,3등


2) 메인쿼리에서 2개의 테이블을 join
    where절에서 리뷰수 1위인 작성자만 필터링(서브쿼리)

-- 아이디별 리뷰 작성 수를 구하는 WITH절
WITH TOTAL_REVIEW AS (
    SELECT MEMBER_ID
            ,DENSE_RANK() OVER (ORDER BY COUNT(REVIEW_ID) DESC) AS REVIEW_RANK
    FROM REST_REVIEW 
    GROUP BY MEMBER_ID)
    
-- 2개의 테이블을 join, where절에서 랭킹1위인 id만 필터링
SELECT PRO.MEMBER_NAME
        ,REV.REVIEW_TEXT
        ,DATE_FORMAT(REV.REVIEW_DATE,"%Y-%m-%d") REVIEW_DATE
FROM MEMBER_PROFILE PRO
    INNER JOIN REST_REVIEW REV
    ON PRO.MEMBER_ID = REV.MEMBER_ID
WHERE REV.MEMBER_ID IN (SELECT MEMBER_ID
                        FROM TOTAL_REVIEW
                        WHERE REVIEW_RANK = 1)
ORDER BY REV.REVIEW_DATE, REV.REVIEW_TEXT
728x90