solvesql
- 게임 평점 예측하기 1
👉 문제 바로가기(solvesql)
-- 2015년 이후에 발매한 게임 중 누락된 평점 정보가 있는 게임에 대해서 같은 장르를 가진 전체 게임의 평균 평점과 평균 평론가/사용자 수를 사용해 누락된 정보를 채우는 쿼리
-- 쿼리 결과에는 누락된 평점 정보가 있는 게임만 포함
-- 평론가와 사용자 평점 평균은 소수점 아래 넷째 자리에서 반올림 해 셋째 자리까지 출력되어야 하고, 사용자 수는 올림하여 자연수로 출력
WITH average_t AS
(
SELECT genre_id, ROUND(AVG(critic_score),3) as avg_critic_score,
CEIL(AVG(critic_count)) as avg_critic_count,
ROUND(AVG(user_score),3) as avg_user_score,
CEIL(AVG(user_count)) as avg_user_count
FROM games
GROUP BY genre_id
)
SELECT t1.game_id, t1.name,
IFNULL(t1.critic_score, t2.avg_critic_score) as critic_score,
IFNULL(t1.critic_count, t2.avg_critic_count) as critic_count,
IFNULL(t1.user_score, t2.avg_user_score) as user_score,
IFNULL(t1.user_count, t2.avg_user_count) as user_count
FROM games t1 INNER JOIN average_t t2
ON t1.genre_id = t2.genre_id
WHERE t1.year >= 2015 AND
(t1.critic_score IS NULL OR
t1.user_score IS NULL)
[ 논리 과정 ]
- 컬럼에 따라 결측치를 대체할 데이터 테이블(A)을 생성한다.
- 기존 테이블에서 조건에 맞는 데이터를 필터링한다.(2015년 이후 & 누락된 평점 존재) (B)
- 위 두 테이블을 JOIN하여 B 테이블의 NULL 값을 A테이블의 데이터로 대체하여 조회한다.
[ 문제 상황 ]
- 연도로 조건을 설정할 때, 조건이 제대로 적용되지 않았다. (2015년 이전 데이터도 계속 출력됨)
[ 해결 ]
- 논리 연산자를 다중으로 적용할 때도 일반 연산과 동일하게 순서가 중요하다.
- OR 조건으로 연결된 조건들(NULL인 컬럼을 찾는 조건)을 괄호에 넣고 AND 조건과 연결한다.
[ 회고 ]
- 논리 연산자도 순서에 영향을 받는다.
'DA Study > TIL' 카테고리의 다른 글
[TIL] 동적 웹페이지 스크래핑, 크롤링하기 #python3 #FConline (1) | 2024.12.27 |
---|---|
[TIL] shrftime()으로 날짜 요일로 변환하기 #SQL #SQLite #solvesql (3) | 2024.12.24 |
[TIL] 3개 이상의 LEFT JOIN, 날짜 형식 포맷팅 #SQL #SQLite #solvesql (0) | 2024.12.21 |
[TIL] 기증품 비율 계산하기 #SQL #ORACLE (2) | 2024.12.20 |
[TIL] 언더스코어(_)가 포함되지 않은 데이터 찾기 #SQL #ORACLE (1) | 2024.12.19 |