03/05 SQL 문제풀이 - 1341. Movie Rating (Leetcode) ⭐⭐⭐⭐⭐

Data Architect / Engineer·2024년 3월 5일
1

1일_1SQL

목록 보기
46/63
post-thumbnail

문제

  • 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절 조건을 통해cnttemp_01max(cnt) 값을 가지는 사용자를 필터링해준다. 이 때 서브쿼리를 통해 max(cnt) 값을 구해준다.

  • max(cnt) 값이 같은 경우, 알파벳 순으로 앞쪽에 있는 사용자의 이름을 출력해야하므로, min(name)을 통해 사용자 이름을 구해준다.

  • 이후 2020년 02월에 평점이 가장 높은 영화의 제목을 구해준다. WHERE절 조건을 통해 avg_ratetemp_02max(avg_rate) 값을 가지는 영화를 필터링 해준다. 이 때 서브쿼리를 통해 max(avg_rate)를 구해준다.

  • 역시 max(avg_rate) 값이 같은 경우, 알파벳 순으로 앞쪽에 있는 사용자의 이름을 출력해야하므로, min(title)을 통해 영화제목을 구해준다.

  • UNION ALL을 통해 두 데이터를 합쳐준다.

  • ⭐⭐⭐⭐⭐ 집계함수와 서브쿼리, 특정 값이 최대/최소를 가질 때 해당 데이터의 다른 정보 구하기, 집계 값이 같은 경우 출력 방법(알파벳 순 등)을 종합적으로 확인할 수 있는 문제였다.

profile
질문은 계속돼 아오에

0개의 댓글