Contents
내가 작성한 쿼리

해결책을 작성하세요:
* 가장 많은 영화를 평점한 사용자의 이름을 찾습니다.
동점일 경우 사전적으로 작은 사용자 이름을 반환합니다.
* 2020년 2월에 평균 평점이 가장 높은 영화 이름을 찾습니다.
동점일 경우 사전적으로 작은 영화 이름을 반환합니다.
내가 작성한 쿼리
MySQL
-- 가장 많은 영화를 평가한 사용자
SELECT name AS results
FROM (
SELECT
u.name,
COUNT(*) AS rating_count
FROM MovieRating mr
JOIN Users u
ON mr.user_id = u.user_id
GROUP BY mr.user_id, u.name
ORDER BY rating_count DESC, u.name ASC
LIMIT 1
) AS TopUser
UNION ALL
-- 2020년 2월 평균 평점이 가장 높은 영화
SELECT title AS results
FROM (
SELECT
m.title,
AVG(mr.rating) AS avg_rating
FROM MovieRating mr
JOIN Movies m
ON mr.movie_id = m.movie_id
WHERE
mr.created_at >= '2020-02-01'
AND mr.created_at < '2020-03-01'
GROUP BY m.movie_id, m.title
ORDER BY avg_rating DESC, m.title ASC
LIMIT 1
) AS TopMovie;
Oracle
-- 가장 많은 영화를 평가한 사용자
SELECT name AS results
FROM (
SELECT u.name,
COUNT(*) AS rating_count,
ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC, u.name ASC) AS rn
FROM MovieRating mr
JOIN Users u
ON mr.user_id = u.user_id
GROUP BY mr.user_id, u.name
)
WHERE rn = 1
UNION ALL
-- 2020년 2월 평균 평점이 가장 높은 영화
SELECT title AS results
FROM (
SELECT m.title,
AVG(mr.rating) AS avg_rating,
ROW_NUMBER() OVER (ORDER BY AVG(mr.rating) DESC, m.title ASC) AS rn
FROM MovieRating mr
JOIN Movies m
ON mr.movie_id = m.movie_id
WHERE mr.created_at >= DATE '2020-02-01'
AND mr.created_at < DATE '2020-03-01'
GROUP BY m.movie_id, m.title
)
WHERE rn = 1;
차이점
항목 | MySQL | Oracle |
최상위 N개 추출 | LIMIT 1 사용 | ROW_NUMBER() + WHERE rn = 1 또는 FETCH FIRST 1 |
날짜 상수 리터럴 | '2020-02-01' (문자열로 처리) | DATE '2020-02-01' (명시적 날짜 리터럴 사용) |
Share article