
👉 문제 바로가기 : 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
;