출처
문제
가장 많은 수의 영화를 평가한 사용자의 이름을 찾습니다. 동률인 경우 사전순으로 더 작은 사용자 이름을 반환합니다.
에서 평균 평점이 가장 높은 영화 이름을 찾습니다. 동점인 경우 사전순으로 더 작은 영화 이름을 반환합니다.February 2020
문제에 대한 해석
1. user테이블과 MovieRating테이블을 통해 가장 많이 평가한 평론가 찾기 | 2. movies테이블과 MovieRating테이블을 활용하서 해당월의 평균평점이 가장 높은 영화 찾기 | 답 : 1과 2를 한 컬럼에 나타내기 |
|
풀이(MYSQL)
-- 1. 가장 많은 수의 영화를 평가한 사람들 > 알파벳순으로 작은것 : 오름차순의 첫번째
with user_cnt as (
select u.user_id
, u.name
, count(m.rating) as 'cnt'
from Users u join MovieRating m
on u.user_id = m.user_id
group by u.user_id,u.name
),
names as(
select name
from user_cnt
where cnt = (select max(cnt)
from user_cnt)
order by name
limit 1
),
-- 2. 2020년 1월에 평가한 영화중 평균 평점이 가장 높은 것 > 알파벳순으로 작은것 : 오름차순의 첫번째
rating as (
select m.movie_id, m.title , avg(mr.rating) as 'rate'
from MovieRating mr join Movies m
on mr.movie_id = m.movie_id
where year(mr.created_at) = 2020
and month(mr.created_at) = 2
group by m.movie_id, m.title
),
titles as (
select title
from rating
where rate = (select max(rate)
from rating)
order by title
limit 1
)
-- 3. 1에서 구했던 평론가와 2에서 구했던 영화명을 results라는 컬럼으로 합치기
select name as 'results'
from names
union all
select title as 'results'
from titles
오답 : union과 union all
1. union사용시 오답
daniel이라는 평론가와 frozen2라는 영화가 출력되어 정답 | 다른 테스트에서는 rebeca만 출력됨 > 평론가와 영화명이 동일해서 중복제거가 되는 상황 |
다른사람 풀이
(SELECT name AS results
FROM MovieRating JOIN Users USING(user_id)
GROUP BY name
ORDER BY COUNT(*) DESC, name
LIMIT 1)
UNION ALL
(SELECT title AS results
FROM MovieRating JOIN Movies USING(movie_id)
WHERE EXTRACT(YEAR_MONTH FROM created_at) = 202002
GROUP BY title
ORDER BY AVG(rating) DESC, title
LIMIT 1);
쿼리요약
1. 가장 많은 수의 영화를 평가한 사람들 > 알파벳순으로 작은것 : 오름차순의 첫번째
|
|
with user_cnt as (
select u.user_id
, u.name
, count(m.rating) as 'cnt'
from Users u join MovieRating m
on u.user_id = m.user_id
group by u.user_id,u.name
),
names as(
select name
from user_cnt
where cnt = (select max(cnt)
from user_cnt)
order by name
limit 1
) select name as'results'
from names
|
SELECT name AS results
FROM MovieRating JOIN Users USING(user_id)
GROUP BY name
ORDER BY COUNT(*) DESC, name
LIMIT 1
|
조회 : 사람의 이름(name) 조건 : 평가를 가장 많이 한 |
1. 2020년 1월에 평가한 영화중 평균 평점이 가장 높은 것 > 알파벳순으로 작은것 : 오름차순의 첫번째
|
|
rating as (
select m.movie_id, m.title , avg(mr.rating) as 'rate'
from MovieRating mr join Movies m
on mr.movie_id = m.movie_id
where year(mr.created_at) = 2020
and month(mr.created_at) = 2
group by m.movie_id, m.title
),
titles as (
select title
from rating
where rate = (select max(rate)
from rating)
order by title
limit 1
)
select title
from titles
|
SELECT title AS results
FROM MovieRating JOIN Movies USING(movie_id)
WHERE EXTRACT(YEAR_MONTH FROM created_at) = 202002
GROUP BY title
ORDER BY AVG(rating) DESC, title
LIMIT 1
|
조회 : 영화명(title) 조건 : 2020년 2월 평균 평가가 가장 높음 |
배운점
- EXTRACT( unit FROM data(컬럼명) ) : 날짜데이터에서 년, 월, 일, 시간 등을 추출
- 예) EXTRACT(YEAR_MONTH FROM created_at) = 202002
- union 사용시 주의
- 쿼리를 구분하는 소괄호를 하지 않으면 에러가 날 수 있다
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] Leet code - Second Highest Salary (0) | 2024.07.12 |
---|---|
[문제풀이] Leet code - Restaurant Growth (0) | 2024.07.10 |
[문제풀이] 프로그래머스 - 언어별 개발자 분류하기 (0) | 2024.07.04 |
[문제풀이] 프로그래머스 - FrontEnd 개발자 찾기 (0) | 2024.07.03 |
[문제풀이] Leet code - Capital Gain/Loss (1) | 2024.07.01 |