프로그래머스 SQL 그룹별 조건에 맞는 식당 목록 출력하기

: ) YOUNG·2025년 7월 2일
1

알고리즘

목록 보기
477/483

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

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

  • 3번 join

  • 날짜 형식 변경




WITH TEMP AS (
    SELECT MEMBER_ID, COUNT(*) AS REVIEW_COUNT
    FROM REST_REVIEW
    GROUP BY MEMBER_ID
)
SELECT
    P.MEMBER_NAME,
    R.REVIEW_TEXT,
    DATE_FORMAT(R.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM
    TEMP T
LEFT JOIN
    MEMBER_PROFILE P ON T.MEMBER_ID = P.MEMBER_ID
JOIN -- INNER JOIN으로 변경하는 것이 더 명확할 수 있습니다.
    REST_REVIEW R ON T.MEMBER_ID = R.MEMBER_ID -- 테이블명을 REST_REVIEW로 가정
WHERE
    T.REVIEW_COUNT = (SELECT MAX(REVIEW_COUNT) FROM TEMP)
ORDER BY R.REVIEW_DATE, R.REVIEW_TEXT



가독성, 효율성 향상 버전


-- CTE 1: 회원별 리뷰 수 계산
WITH MEMBER_REVIEW_COUNTS AS (
    SELECT
        MEMBER_ID,
        COUNT(*) AS REVIEW_COUNT
    FROM
        REST_REVIEW
    GROUP BY
        MEMBER_ID
),
-- CTE 2: 리뷰 수 기준으로 순위(RANK) 매기기
TOP_REVIEWERS AS (
    SELECT
        MEMBER_ID,
        REVIEW_COUNT,
        -- 동점자를 모두 1위로 처리하기 위해 DENSE_RANK() 사용
        DENSE_RANK() OVER (ORDER BY REVIEW_COUNT DESC) AS RNK
    FROM
        MEMBER_REVIEW_COUNTS
)
-- 메인 쿼리: 필요한 정보 JOIN 및 최종 필터링
SELECT
    P.MEMBER_NAME,
    R.REVIEW_TEXT,
    DATE_FORMAT(R.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM
    TOP_REVIEWERS T
JOIN
    REST_REVIEW R ON T.MEMBER_ID = R.MEMBER_ID
JOIN
    MEMBER_PROFILE P ON T.MEMBER_ID = P.MEMBER_ID
WHERE
    T.RNK = 1 -- 순위가 1위인 회원만 선택
ORDER BY
    R.REVIEW_DATE, R.REVIEW_TEXT;
    
    
  • 동점자를 모두 1위로 처리하기 위해 DENSE_RANK() 사용
    DENSE_RANK()

0개의 댓글