코딩테스트/SQL
SQL > 프로그래머스 131124 [level 4] 그룹별 조건에 맞는 식당 목록 출력하기
Porits789
2024. 7. 30. 10:31
문제
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