MEMBER_PROFILE와REST_REVIEW테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.
# 처음 작성한 답안 - Limit사용(권장x)
SELECT MEMBER_NAME, REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE, "%Y-%m-%d") AS REVIEW_DATE
FROM REST_REVIEW AS R JOIN MEMBER_PROFILE AS P USING(MEMBER_ID)
WHERE MEMBER_ID = (SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
ORDER BY COUNT(REVIEW_ID) DESC
LIMIT 1 )
ORDER BY REVIEW_DATE, REVIEW_TEXT
# 다시 풀었을 때 작성한 답안
# 최다리뷰자가 여러명일 경우를 고려 - RANK() 사용(권장)
WITH DEVOTED_REVIEWER AS (
SELECT MEMBER_ID,
RANK() OVER (ORDER BY COUNT(REVIEW_ID) DESC) AS REVIEW_RANK
FROM REST_REVIEW
GROUP BY MEMBER_ID
)
SELECT M.MEMBER_NAME,
R.REVIEW_TEXT,
DATE_FORMAT(R.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM DEVOTED_REVIEWER D JOIN MEMBER_PROFILE M USING(MEMBER_ID)
JOIN REST_REVIEW R USING(MEMBER_ID)
WHERE D.REVIEW_RANK = 1
ORDER BY 3, 2;
처음 이 문제를 풀었을 때, 최다리뷰 작성자를 필터링 하기 위해 회원별로 작성한 리뷰수를 내림차순으로 정렬해서 Limit를 사용하여 1명의 회원만 추출하게 했다. 코드 실행도 잘되었고 제출 했을 때 정답처리도 되었다. 하지만 생각해보면 최다리뷰 작성자는 여러명일 수 있다. 실제로 문제에서 최다리뷰 작성자를 조회해본 결과, 결과는 아래와 같이 3명의 공동 최다리뷰작성자가 있음을 확인했다.

정답처리가 되었지만 나중에 다시 풀어볼 때는 RANK()를 사용하여 리뷰수가 많은 순으로 정렬한 뒤 순위가 1인 행만 추출하는 방식으로 해야겠다고 생각했다.
시간이 지난 뒤 다시 문제를 풀면서 with문을 사용해 회원별로 남긴 리뷰수에 따라 순위를 매긴 임시 테이블을 만들어주고, 최종 테이블과 결합해서 순위가 1인 회원만 추출했다.
WHERE D.REVIEW_RANK = 1
그 결과 아래와 같이 3명의 리뷰작성내역이 나왔고, 제출결과 정답처리 되었다.
