그룹별 조건에 맞는 식당 목록 출력하기

수이·7일 전
0

🟢 코드카타 / SQL

목록 보기
70/81

MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.
문제링크

조건정리

  1. 리뷰를 가장많이 작성한 회원의 리뷰 조회
  2. 회원이름, 리뷰 텍스트, 리뷰 작성일 출력
  3. 리뷰 작성일 기준 오름차순, 리뷰 텍스트 기준 오름차순 정렬

풀이

  • 첫번째 풀이
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에서 서브쿼리 여는 방식이 익숙하지 않은 것 같다 한 사람만 뽑는 경우에는 이게 제일 빠르지 않을까 싶음

0개의 댓글

관련 채용 정보