[solvesql - day 17] lv3 멀티 플랫폼 게임 찾기

데프·2024년 12월 23일

👉 문제 바로가기 : solvesql - Advent of SQL 2024 DAY 17
저작권 문제로 링크만 첨부한다.

✔️문제 풀이에 필요한 점

조건문과 group by를 적절히 사용하면 풀 수 있는 문제.
난이도도 3으로 평이하다.

❌ 미흡한 답안

SELECT
  games.name
FROM
  games
  LEFT JOIN platforms USING (platform_id)
WHERE
  year >= 2012
GROUP BY
  games.name
HAVING
    max(CASE WHEN platforms.name in ('PS3', 'PS4', 'PSP', 'PSV') THEN 1 ELSE 0 END)
      + max(CASE WHEN platforms.name in ('Wii', 'WiiU', 'DS', '3DS') THEN 1 ELSE 0 END)
      + max(CASE WHEN platforms.name in ('X360', 'XONE') THEN 1 ELSE 0 END)
      >= 2
;

문제점

답을 적다보니 CASE문을 3개 쓰게 됐는데,
최적화 측면에선 하나의 CASE문으로 처리하는 것이 당연히 더 효율적이다.

짧다고 좋은 쿼리가 아니라는 것의 좋은 예

✍️수정된 답안

WITH labeled AS (
  SELECT
    games.name
    , CASE 
      WHEN platforms.name in ('PS3', 'PS4', 'PSP', 'PSV') THEN 1 
      WHEN platforms.name in ('Wii', 'WiiU', 'DS', '3DS') THEN 2
      WHEN platforms.name in ('X360', 'XONE') THEN 3 
    END pnum
  FROM
    games
    LEFT JOIN platforms USING (platform_id)
  WHERE
    year >= 2012
)
SELECT
  name
FROM
  labeled
GROUP BY
  name
HAVING
  count(DISTINCT pnum) >= 2
;
profile
정보의 홍수를 기록하는 데프의 로그

0개의 댓글