문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[문제 포인트 짚기]

MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의

리뷰들을 조회하는 SQL문을 작성해 주세요.

 

tip) 리뷰를 가장 많이 작성한 회원이 한 명이 아닌 경우에 모두 출력해야 한다.

(ex. A:3개, B:3개 => A, B 모두 출력)

 

풀이

1. count 칼럼 추가하기

식별자로 MEMBER_ID를 사용할 것이므로! REST_REVIEW테이블에서 각 MEMBER_ID별 리뷰의 수를 count 해서 칼럼으로 추가해 주었다.

여기서 추가로 생각한 점은 나중에 리뷰를 가져와야 하기 때문에 count열에만 group을 적용하는 방법을 사용했다.

WITH CTE AS (
    SELECT 
        MEMBER_ID,
        REVIEW_TEXT, 
        REVIEW_DATE,
        COUNT(*) OVER (PARTITION BY MEMBER_ID) as c
    FROM REST_REVIEW
)

 

 

2. rank 적용하기

가장 많은 리뷰수를 갖는 id를 찾아야 하므로 count에 rank를 적용해 주고 rank=1인 경우만을 가져오고자 했다.

, CTE2 AS (
    SELECT *,RANK() OVER (ORDER BY c DESC) as rk
    FROM CTE
)

 

3. 출력양식에 맞추기

마지막은 출력양식에 맞추어 결과를 나타내면 된다. 생각할 점은 DATE_FORMAT, 정렬 순서 정도가 있겠다.

WITH CTE AS (
    SELECT 
        MEMBER_ID,
        REVIEW_TEXT, 
        REVIEW_DATE,
        COUNT(*) OVER (PARTITION BY MEMBER_ID) as c
    FROM REST_REVIEW
)
, CTE2 AS (
    SELECT *,RANK() OVER (ORDER BY c DESC) as rk
    FROM CTE
)
SELECT m.MEMBER_NAME, c.REVIEW_TEXT, DATE_FORMAT(c.REVIEW_DATE, '%Y-%m-%d') as REVIEW_DATE
FROM CTE2 c JOIN MEMBER_PROFILE m
    ON c.MEMBER_ID = m.MEMBER_ID
WHERE rk = 1
ORDER BY 3,2

 

+ Recent posts