DA Study/TIL

[TIL] 다중 논리 연산자, 게임 평점 예측하기 1 #SQL #SQLite #solvesql

harrym8n 2024. 12. 22. 18:42

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)

[ 논리 과정 ]

  1. 컬럼에 따라 결측치를 대체할 데이터 테이블(A)을 생성한다.
  2. 기존 테이블에서 조건에 맞는 데이터를 필터링한다.(2015년 이후 & 누락된 평점 존재) (B)
  3. 위 두 테이블을 JOIN하여 B 테이블의 NULL 값을 A테이블의 데이터로 대체하여 조회한다.

[ 문제 상황 ]

  • 연도로 조건을 설정할 때, 조건이 제대로 적용되지 않았다. (2015년 이전 데이터도 계속 출력됨)

[ 해결 ]

  • 논리 연산자를 다중으로 적용할 때도 일반 연산과 동일하게 순서가 중요하다.
  • OR 조건으로 연결된 조건들(NULL인 컬럼을 찾는 조건)을 괄호에 넣고 AND 조건과 연결한다.

[ 회고 ]

  • 논리 연산자도 순서에 영향을 받는다.