📜 문제 설명
다음은 식당의 정보를 담은 REST_INFO 테이블과 식당의 리뷰 정보를 담은 REST_REVIEW 테이블입니다.
MEMBER_PROFILE 테이블은 다음과 같으며 MEMBER_ID, MEMBER_NAME, TLNO, GENDER, DATE_OF_BIRTH는 회원 ID,
회원 이름, 회원 연락처, 성별, 생년월일을 의미합니다.
Column name | Type | Nullable |
MEMBER_ID | VARCHAR(100) | FALSE |
MEMBER_NAME | VARCHAR(50) | FALSE |
TLNO | VARCHAR(50) | TRUE |
GENDER | VARCHAR(1) | TRUE |
DATE_OF_BIRTH | DATE | TRUE |
Column name | Type | Nullable |
REVIEW_ID | VARCHAR(10) | FALSE |
REST_ID | VARCHAR(10) | TRUE |
MEMBER_ID | VARCHAR(100) | TRUE |
REVIEW_SCORE | NUMBER | TRUE |
REVIEW_TEXT | VARCHAR(1000) | TRUE |
REVIEW_DATE | DATE | TRUE |
❓ 문제
MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요.
회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/131124
💡 문제 풀이
여태껏 푼 문제들 중에서 제일 어렵게 푼 것 같다.. 이게 맞나 싶음 (따라하지 마세요)
문제 제목 부터 대놓고 GROUP BY를 잘 쓰라고 힌트를 주고 있다. 근데 나는 그룹 너무 여러 번 들어가니까 헷갈려서 결국엔 편법을 썼다.
가장 안 쪽 서브쿼리 부터 바깥쪽으로 풀이를 해보자면
- 우선 가장 리뷰를 많이 작성한 사용자를 찾기 위해 아이디별 작성횟수를 조회하고 작성횟수 기준 내림차순으로 정렬한다 (이게 편법)
- 내림차순으로 정렬되 있으니까 1번 row가 가장 리뷰를 많이 작성한 사용자이다. 1번 row만 가져온다.
- 위 두개의 서브쿼리를 합친 결과 (=가장 리뷰를 많이 작성한 사용자 아이디)를 두 테이블과 조인한다.
- 필요한 정보만 조회한다.
SELECT m.member_name, r.review_text, TO_CHAR(r.review_date, 'YYYY-MM-DD') AS review_date
FROM rest_review r
JOIN
(
SELECT member_id, cnt
FROM
(
SELECT member_id, COUNT(*) AS cnt FROM rest_review
GROUP BY member_id
ORDER BY cnt DESC
)
WHERE ROWNUM = 1
) tmp
ON r.member_id = tmp.member_id
JOIN member_profile m
ON r.member_id = m.member_id
ORDER BY review_date, review_text
아마 출제자의 의도는 GROUP BY와 HAVING을 잘 쓰라는 것이 었을것 같다.
'✨APS (Algorithm Problem Solving) > 프로그래머스 SQL' 카테고리의 다른 글
[프로그래머스 SQL] 인기있는 아이스크림 / 오라클(Oracle) (0) | 2022.11.04 |
---|---|
[프로그래머스 SQL] 상품을 구매한 회원 비율 구하기 / 오라클 (Oracle) (0) | 2022.10.27 |
[프로그래머스 SQL] 취소되지 않은 진료 예약 조회하기 / 오라클(Oracle) (0) | 2022.10.25 |
[프로그래머스 SQL] 진료과별 총 예약 횟수 출력하기 / 오라클(Oracle) (0) | 2022.10.25 |
[프로그래머스 SQL] 오프라인/온라인 판매 데이터 통합하기 / 오라클(Oracle) (0) | 2022.10.20 |