✨APS (Algorithm Problem Solving)/프로그래머스 SQL

[프로그래머스 SQL] 그룹별 조건에 맞는 식당 목록 출력하기 / 오라클(Oracle)

Nyan cat 2022. 10. 25. 14:09

 

📜 문제 설명

다음은 식당의 정보를 담은 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
 
REST_REVIEW 테이블은 다음과 같으며 REVIEW_IDREST_ID, MEMBER_ID, REVIEW_SCORE, REVIEW_TEXT, REVIEW_DATE는 각각 리뷰 ID, 식당 ID, 회원 ID, 점수, 리뷰 텍스트, 리뷰 작성일을 의미합니다.
 
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

 

프로그래머스

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

programmers.co.kr

 

💡 문제 풀이

여태껏 푼 문제들 중에서 제일 어렵게 푼 것 같다.. 이게 맞나 싶음 (따라하지 마세요)

문제 제목 부터 대놓고 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을 잘 쓰라는 것이 었을것 같다.

반응형