홍동이의 성장일기
[LeetCode] 1341. Movie Rating (Union vs. Union All) 본문
(SELECT u.name as results
FROM movierating mr
INNER JOIN users u
ON mr.user_id = u.user_id
GROUP BY u.name
ORDER BY count(mr.rating) DESC, u.name
LIMIT 1)
UNION ALL
(SELECT m.title as results
FROM movierating as mr
INNER JOIN movies as m
ON mr.movie_id = m.movie_id
WHERE DATE_FORMAT(created_at, '%Y-%m') = '2020-02'
GROUP BY m.title
ORDER BY AVG(mr.rating) DESC, m.title
LIMIT 1)
💡 문제 풀이
1️⃣ 가장 많은 영화를 평점한 사용자의 이름을 찾는다.
SELECT u.name as results
FROM movierating mr
INNER JOIN users u
ON mr.user_id = u.user_id
GROUP BY u.name
ORDER BY count(mr.rating) DESC, u.name
LIMIT 1
2️⃣ 2020년 2월에 평균 평점이 가장 높은 영화 이름을 찾는다.
SELECT m.title as results
FROM movierating as mr
INNER JOIN movies as m
ON mr.movie_id = m.movie_id
WHERE DATE_FORMAT(created_at, '%Y-%m') = '2020-02'
GROUP BY m.title
ORDER BY AVG(mr.rating) DESC, m.title
LIMIT 1
3️⃣ 구한 값을 UNION ALL 하여 합쳐준다.
📍 UNION vs. UNION ALL
- UNION: 중복된 ROW 제거
- UNION ALL: 중복 제거X
➡️ 이 문제에서 UNION을 해주면 오류가 발생하는데, 그 이유는 영화 이름과 사용자의 이름이 겹치는 경우가 발생하기 때문이다. 따라서 UNION ALL을 사용하여 중복이 발생하는 경우에도 제거되지 않도록 해주어야 한다.
728x90
'Tool > SQL 코딩테스트 풀이' 카테고리의 다른 글
[LeetCode] 1934. Confirmation Rate (특정 조건에 부합하는 확률 구하기) (0) | 2024.03.18 |
---|---|
[LeetCode] 1907. Count Salary Categories (범위에 값이 없으면 0을 반환) (1) | 2024.01.07 |
[LeetCode] 1204. Last Person to Fit in the Bus (누적합계 구하기) (1) | 2023.12.30 |
[LeetCode] 1193. Monthly Transactions I (Date_format 날짜 함수) (0) | 2023.12.24 |
[LeetCode] 1174. Immediate Food Delivery II (집계함수에 조건 작성하기) (0) | 2023.12.22 |
Comments