꿈꾸는 개발자의 블로그
[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 그룹별 조건에 맞는 식당 목록 출력하기 본문
Algorithm/Programmers
[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 그룹별 조건에 맞는 식당 목록 출력하기
aldrn29 2023. 2. 22. 13:14문제
MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.
문제 풀이
처음에는 GROUP BY를 두 번 사용하는 방법밖에 떠오르지 않았다. 그렇게 정답을 제출하고 나서 다른 사람의 풀이도 보게 되었는데, RANK를 이용한 풀이 방법이 있어서 같이 정리해보았다.
HAVING 조건을 이용한 풀이
- 리뷰를 가장 많이 작성한 회원을 찾기 위하여 회원별 GROUP BY로 묶는다. (HAVING 서브쿼리)
- 그 중 리뷰의 개수를 알기 위하여 count 함수로 조회한 것 중 max 함수로 가장 큰 값을 찾는다. (HAVING 서브쿼리)
- 위의 결과로 찾은 가장 많은 리뷰 개수와 또 다른 회원별 GROUP BY로 묶은 쿼리의 리뷰 개수가 같은 (HAVING 조건) 회원을 조회한다.
- MEMBER_PROFILE와 REST_REVIEW 테이블을 JOIN 한다.
- 회원이 3번의 결과로 나온 회원에 포함되어 있는지 확인한다.
RANK를 이용한 풀이
- 리뷰를 가장 많이 작성한 회원을 찾기 위하여 회원별 GROUP BY로 묶는다. (서브쿼리)
- 그 중 리뷰의 개수를 알기 위하여 count 함수로 조회한 것을 내림차순으로 정렬하여, rank 함수로 순위를 매긴다. (서브쿼리)
- 위의 서브쿼리와 기존 두 테이블을 JOIN한다.
- 리뷰의 개수로 순위를 매긴 것 중 가장 많은 것만 조회하기 위하여 WHERE 조건을 건다.
전체 코드
HAVING 조건을 이용한 코드
SELECT MEMBER_NAME, REVIEW_TEXT, TO_CHAR(REVIEW_DATE, 'YYYY-MM-DD') AS REVIEW_DATE
FROM MEMBER_PROFILE a JOIN REST_REVIEW b ON a.MEMBER_ID = b.MEMBER_ID -- 4
WHERE A.MEMBER_ID IN ( -- 5
SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
HAVING count(*) = ( -- 3
SELECT max(count(*)) -- 2
FROM REST_REVIEW
GROUP BY MEMBER_ID -- 1
))
ORDER BY 3, 2
RANK를 이용한 코드
SELECT MEMBER_NAME, REVIEW_TEXT, TO_CHAR(REVIEW_DATE, 'YYYY-MM-DD') AS REVIEW_DATE
FROM (
SELECT MEMBER_ID, rank() OVER (ORDER BY count(MEMBER_ID) DESC) AS RANK -- 2
FROM REST_REVIEW
GROUP BY MEMBER_ID -- 1
) NATURAL JOIN MEMBER_PROFILE NATURAL JOIN REST_REVIEW -- 3
WHERE RANK = 1 -- 4
ORDER BY 3, 2
728x90
728x90
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 주문량이 많은 아이스크림들 조회하기 (0) | 2023.02.24 |
---|---|
[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2023.02.22 |
[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 조건에 맞는 도서와 저자 리스트 출력하기 (0) | 2023.02.22 |
[프로그래머스] Oracle - (SQL 고득점 Kit) GROUP BY 가격대 별 상품 개수 구하기 (0) | 2023.02.21 |
[프로그래머스] Oracle - (SQL 고득점 Kit) GROUP BY 입양 시각 구하기(2) (0) | 2023.02.21 |
Comments