SQL/solvesql Advent of SQL 2024

[SQL] solvesql Advent of SQL 2024 17일차

주댕이 2024. 12. 18. 00:00

# 링크

 

https://solvesql.com/collections/advent-of-sql-2024/

 

solvesql.com

 

https://solvesql.com/problems/multiplatform-games/

 

solvesql.com

 

 

# 풀이

-- 2012년 이후 출시된 게임
WITH after_2012 AS (
SELECT
  g.name AS game_name,
  p.name AS platform_name
FROM games g
JOIN platforms p
ON g.platform_id = p.platform_id
WHERE g.year >= 2012
),
-- 메이저 플랫폼 계열에 출시된 게임
major_platform AS (
SELECT
  game_name,
  CASE
    WHEN platform_name IN ('PS3', 'PS4', 'PSP', 'PSV') THEN 'Sony'
    WHEN platform_name IN ('Wii', 'WiiU', 'DS', '3DS') THEN 'Nintendo'
    WHEN platform_name IN ('X360', 'XONE') THEN 'Microsoft'
  END AS platform_family
FROM after_2012
WHERE platform_family IS NOT NULL
)
-- 둘 이상의 메이저 플랫폼 계열에 출시된 게임, 중복 제거
SELECT DISTINCT
  game_name AS name
FROM major_platform
GROUP BY name
HAVING COUNT(DISTINCT platform_family) >= 2;
  • after_2012 CTE
    • SELECT
      • g.name AS game_name: games 테이블의 name 컬럼을 game_name으로 저장한다.
      • p.name AS platform_name: platforms 테이블의 name 컬럼을 platform_name으로 저장한다.
    • FROM games g: games 테이블의 별칭을 g로 설정하고, 해당 테이블에서 데이터를 가져온다.
    • JOIN platforms p ON g.platform_id = p.platform_id: platforms 테이블의 별칭을 p로 설정하고, platform_id 컬럼을 기준으로 games 테이블과 platforms 테이블을 조인한다.
    • WHERE g.year >= 2012: games 테이블의 year이 2012 이상인 데이터만 선택한다.
  • major_platform CTE
    • SELECT
      • game_name: game_name 컬럼을 선택한다.
      • CASE
        • WHEN platform_name IN ('PS3', 'PS4', 'PSP', 'PSV') THEN 'Sony': platform_name이 'PS3', 'PS4', 'PSP', 'PSV' 중 하나일 경우 'Sony'로 분류한다.
        • WHEN platform_name IN ('Wii', 'WiiU', 'DS', '3DS') THEN 'Nintendo': platform_name이 'Wii', 'WiiU', 'DS', '3DS' 중 하나일 경우 'Nintendo'로 분류한다.
        • WHEN platform_name IN ('X360', 'XONE') THEN 'Microsoft': platform_name이 'X360', 'XONE' 중 하나일 경우 'Microsoft'로 분류한다.
      • END AS platform_family: 해당 값을 platform_family로 저장한다.
    • FROM after_2012: after_2012 CTE에서 데이터를 가져온다.
    • WHERE platform_family IS NOT NULL: platform_family의 값이 NULL이 아닌 데이터만 선택한다.
  • SELECT DISTINCT game_name AS name: game_name 컬럼의 고유값을 name으로 저장한다.
  • FROM major_platform: major_platform CTE에서 데이터를 가져온다.
  • GROUP BY name: name을 기준으로 그룹화한다.
  • HAVING COUNT(DISTINCT platform_family) >= 2: platform_family의 고유값의 개수가 2 이상인 데이터만 선택한다.
728x90