-
[SQL] 그룹별 조건에 맞는 식당 목록 출력하기 SQLSQL 배우기 2024. 3. 19. 18:17
프로그래머스 SQL 문제 중에 괜찮은 문제가 있어서 가지고 왔습니다. [그룹별 조건에 맞는 식당 목록 출력하기]
괜찮다고 생각한 이유는 1) 서브 쿼리 2) 윈도우 함수 3) 조인 이 복합적으로 사용되는 좋은 문제이기 때문입니다!
우선 문제는 리뷰를 가장 많이 작성한 회원의 리뷰를 조회하는 코드를 짜는 것입니다.
저는 두 가지 방식으로 문제를 풀어볼건데요. 비슷한 풀이이지만 "윈도우 함수 사용 여부"에 차이가 있습니다!
1) 리뷰를 많이 쓴 회원을 찾기 - 윈도우 함수 사용
2) 회원별 리뷰의 갯수 중에 가장 많은 리뷰의 갯수를 찾기 - 윈도우 함수 미사용
1) 리뷰를 많이 쓴 회원을 찾기 - 윈도우 함수 사용
< where 절을 보시면 b 테이블에서 리뷰 갯수로 1등한 사용자만 가지고 옵니다. >
with b as ( SELECT MEMBER_ID , dense_rank() over(order by count(REVIEW_ID) desc) as den_rank from REST_REVIEW group by 1 ) select c.MEMBER_name, REVIEW_TEXT, date_format(REVIEW_DATE,'%Y-%m-%d') as REVIEW_DATE from REST_REVIEW a left join b on a.MEMBER_ID = b.MEMBER_ID left join MEMBER_PROFILE c on a.MEMBER_ID = c.MEMBER_ID where 1=1 and a.member_id in (select MEMBER_ID from b where den_rank = 1) order by 3,2
2) 회원별 리뷰의 갯수 중에 가장 많은 리뷰의 갯수를 찾기 - 윈도우 함수 미사용
< where 절을 보시면 회원별 리뷰 수 중 가장 많은 리뷰 갯수를 가지고 옵니다. >
with b as ( SELECT MEMBER_ID, count(REVIEW_ID) as REVIEW_cnt from REST_REVIEW group by 1 ) select c.MEMBER_name, REVIEW_TEXT, date_format(REVIEW_DATE,'%Y-%m-%d') as REVIEW_DATE from REST_REVIEW a left join b on a.MEMBER_ID = b.MEMBER_ID left join MEMBER_PROFILE c on a.MEMBER_ID = c.MEMBER_ID where 1=1 and b.REVIEW_cnt = (select max(REVIEW_cnt) from b) order by 3,2
[윈도우 함수]
또한 추가로 윈도우 함수를 사용 중에 위와 아래가 같은 결과를 나타냄을 참고하시면 이해가 쉬울 것입니다!
SELECT MEMBER_ID, DENSE_RANK() OVER(ORDER BY COUNT(*) DESC) AS RNK FROM REST_REVIEW GROUP BY MEMBER_ID
SELECT MEMBER_ID, DENSE_RANK() OVER(ORDER BY cnt DESC) AS RNK FROM ( SELECT MEMBER_ID, COUNT(*) AS cnt FROM REST_REVIEW GROUP BY MEMBER_ID ) AS subquery;
'SQL 배우기' 카테고리의 다른 글
[Leetcode] Human Traffic of Stadium (0) 2024.03.21 [SQL] 입양 시각 구하기(2) 재귀 쿼리 WITH RECURSIVE (0) 2024.03.19 [SQL] 가로 데이터를 세로로 변환하기 (SQL 난이도 중) (0) 2024.01.12 [HiveSQL] 특정 문자 기준으로 문자열 나누기 (특수문자 해결) (0) 2024.01.11 주피터노트북에서 MySQL 설치 및 연동하기 (0) 2024.01.10