문제
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
'코딩테스트 > SQL' 카테고리의 다른 글
SQL > LeetCode 177. Nth Highest Salary (MySQL) (0) | 2024.08.03 |
---|---|
SQL > 프로그래머스 276035 [level 4] FrontEnd 개발자 찾기 (0) | 2024.07.31 |
SQL > 프로그래머스 276036 [level 4] 언어별 개발자 분류하기 (0) | 2024.07.02 |
SQL > 프로그래머스 59413 [level 4] 입양 시각 구하기(2) (0) | 2024.07.01 |
SQL > 프로그래머스 151139 [level 3] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.06.27 |