
문제
- LeetCode SQL 문제
1341. Movie Rating / Medium- 문제 내용 : [링크]
내가 작성한 Query
with temp_01 as( select a.user_id, b.name, count(*) as cnt from movierating a join users b on a.user_id = b.user_id group by user_id ), temp_02 as ( select a.movie_id, b.title, avg(a.rating) as avg_rate from movierating a join movies b on a.movie_id = b.movie_id where a.created_at between '2020-02-01' and '2020-02-28' group by a.movie_id ) select min(a.name) as results from temp_01 a where cnt = (select max(cnt) from temp_01) union all select min(title) as results from temp_02 where avg_rate = (select max(avg_rate) from temp_02)
가장 많은 후기를 작성한 사람의 이름과, 2020년 2월에 평균 평점이 가장 높은 영화의 제목을 찾는 문제이다.
먼저 temp_01 테이블을 통해, user_id별 후기 작성 횟수(count(*) as cnt)와 user_id에 해당하는 사용자 이름name을 구해준다. 이 때, 사용자 이름은 users 테이블에, 나머지 정보는 movierating 테이블에 있으므로 JOIN을 통해 구해준다.
이어서, temp_02 테이블을 통해, movie_id별 평균 평점(avg(rating) as avg_rate)을 구해준다. 이 때, 2020년 02월에 작성된 평점들의 평균만 구하라는 조건이 있으므로, WHERE절 조건을 통해 created_at이 2020년 02월인 데이터만 필터링해준다.
이제 가장 많은 후기를 작성한 사용자의 이름을 구해준다. WHERE절 조건을 통해cnt가 temp_01의 max(cnt) 값을 가지는 사용자를 필터링해준다. 이 때 서브쿼리를 통해 max(cnt) 값을 구해준다.
max(cnt) 값이 같은 경우, 알파벳 순으로 앞쪽에 있는 사용자의 이름을 출력해야하므로, min(name)을 통해 사용자 이름을 구해준다.
이후 2020년 02월에 평점이 가장 높은 영화의 제목을 구해준다. WHERE절 조건을 통해 avg_rate가 temp_02의 max(avg_rate) 값을 가지는 영화를 필터링 해준다. 이 때 서브쿼리를 통해 max(avg_rate)를 구해준다.
역시 max(avg_rate) 값이 같은 경우, 알파벳 순으로 앞쪽에 있는 사용자의 이름을 출력해야하므로, min(title)을 통해 영화제목을 구해준다.
UNION ALL을 통해 두 데이터를 합쳐준다.
⭐⭐⭐⭐⭐ 집계함수와 서브쿼리, 특정 값이 최대/최소를 가질 때 해당 데이터의 다른 정보 구하기, 집계 값이 같은 경우 출력 방법(알파벳 순 등)을 종합적으로 확인할 수 있는 문제였다.
