MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.
문제링크
조건정리
풀이
WITH rnk_members AS
(
SELECT member_id,
RANK() OVER(ORDER BY COUNT(*) DESC) AS rnk
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 rnk_members rm
INNER JOIN member_profile m ON rm.member_id = m.member_id
INNER JOIN rest_review r ON rm.member_id = r.member_id
WHERE rm.rnk = 1
ORDER BY r.review_date, r.review_text
WITH cnt_review AS
(
SELECT member_id, COUNT(*) AS review_count
FROM rest_review
GROUP BY member_id
),
rnk_members AS
(
SELECT member_id,
ROW_NUMBER() OVER(ORDER BY review_count DESC) AS rnk
FROM cnt_review
)
SELECT m.member_name, r.review_text, DATE_FORMAT(r.review_date, '%Y-%m-%d') AS review_date
FROM member_profile m
INNER JOIN rnk_members rm ON m.member_id = rm.member_id
INNER JOIN rest_review r ON r.member_id = rm.member_id
WHERE rm.rnk = 1
ORDER BY r.review_date, r.review_text
굳이..인 것 같긴 한데 좀 더 구조화하고 동점자 없이 하나만 뽑는 걸로 작성해봄 이것도 정답처리 되긴 했다
다른사람 풀이
SELECT M.MEMBER_NAME, R.REVIEW_TEXT, SUBSTR(R.REVIEW_DATE,1, 10) REVIEW_DATE
FROM MEMBER_PROFILE M
JOIN REST_REVIEW R ON M.MEMBER_ID = R.MEMBER_ID
WHERE M.MEMBER_ID = (
SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
ORDER BY COUNT(*) DESC
LIMIT 1
)
ORDER BY R.REVIEW_DATE, R.REVIEW_TEXT
난 아직 이렇게 where에서 서브쿼리 여는 방식이 익숙하지 않은 것 같다 한 사람만 뽑는 경우에는 이게 제일 빠르지 않을까 싶음