Notice
Recent Posts
Recent Comments
Archives
반응형
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Today
Total
11-15 05:46
250x250
관리 메뉴

꿈꾸는 개발자의 블로그

[프로그래머스] 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 조건을 이용한 풀이

  1. 리뷰를 가장 많이 작성한 회원을 찾기 위하여 회원별 GROUP BY로 묶는다. (HAVING 서브쿼리)
  2. 그 중 리뷰의 개수를 알기 위하여 count 함수로 조회한 것 중 max 함수로 가장 큰 값을 찾는다. (HAVING 서브쿼리)
  3. 위의 결과로 찾은 가장 많은 리뷰 개수와 또 다른 회원별 GROUP BY로 묶은 쿼리의 리뷰 개수가 같은 (HAVING 조건) 회원을 조회한다.
  4. MEMBER_PROFILE와 REST_REVIEW 테이블을 JOIN 한다.
  5. 회원이 3번의 결과로 나온 회원에 포함되어 있는지 확인한다.

RANK를 이용한 풀이

  1. 리뷰를 가장 많이 작성한 회원을 찾기 위하여 회원별 GROUP BY로 묶는다. (서브쿼리)
  2. 그 중 리뷰의 개수를 알기 위하여 count 함수로 조회한 것을 내림차순으로 정렬하여, rank 함수로 순위를 매긴다. (서브쿼리)
  3. 위의 서브쿼리와 기존 두 테이블을 JOIN한다.
  4. 리뷰의 개수로 순위를 매긴 것 중 가장 많은 것만 조회하기 위하여 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
Comments