홍동이의 성장일기

[HackerRank] Ollivander's Inventory 본문

Tool/SQL 코딩테스트 풀이

[HackerRank] Ollivander's Inventory

홍동2 2023. 10. 12. 18:21

 

Ollivander's Inventory | HackerRank

Help pick out Ron's new wand.

www.hackerrank.com

※ 윈도우 함수를 사용할 때는 DB를 MS SQL Server로 변경해주어야 합니다.

 

SELECT id
    , age
    , coins_needed
    , power
FROM (
    SELECT w.code
        , w.id
        , wp.age
        , w.coins_needed
        , w.power
        , ROW_NUMBER() OVER(PARTITION BY wp.age, w.power ORDER BY w.coins_needed) as num
    FROM wands AS w
        LEFT JOIN wands_property AS wp ON w.code = wp.code
    WHERE is_evil = 0
) as t
WHERE num = 1
ORDER BY power DESC, age DESC

 

 

💡 문제풀이

 

SELECT w.code
    , w.id
    , wp.age
    , w.coins_needed
    , w.power
FROM wands AS w
    LEFT JOIN wands_property AS wp
    ON w.code = wp.code
WHERE is_evil = 0
    AND w.code = 1
ORDER BY w.power DESC, w.coins_needed DESC

    age를 함께 나타내주기 위해 wands와 wands_property 테이블을 조인해줍니다. 필요한 컬럼들을 가져와줍니다. WHERE절을 통해 is_evil이 0이라는 조건을 지정해줍니다. 과정을 직관적으로 보기 위해 code가 1인 행만 살펴보겠습니다.

 

 

 

 

 

 

SELECT w.code
    , w.id
    , wp.age
    , w.coins_needed
    , w.power
    , ROW_NUMBER() OVER(PARTITION BY wp.age, w.power ORDER BY w.coins_needed) as num
FROM wands AS w
    LEFT JOIN wands_property AS wp ON w.code = wp.code
WHERE is_evil = 0
    AND w.code = 1
ORDER BY w.power DESC, w.coins_needed DESC

    윈도우 함수 ROW_NUMBER을 사용하여 age, power 별로 coins_needed에 따른 순위를 부여합니다. power이 1인 지팡이가 2개 있으므로 coins_needed가 적은 순서대로 순위가 부여되었습니다. 우리는 power가 같은 경우 가장 저렴한 지팡이만 출력해주면 됩니다.

 

 

 

 

 

 

SELECT id
    , age
    , coins_needed
    , power
FROM (
    SELECT w.code
        , w.id
        , wp.age
        , w.coins_needed
        , w.power
        , ROW_NUMBER() OVER(PARTITION BY wp.age, w.power ORDER BY w.coins_needed) as num
    FROM wands AS w
        LEFT JOIN wands_property AS wp ON w.code = wp.code
    WHERE is_evil = 0
        AND w.code = 1
) as t
WHERE num = 1
ORDER BY power DESC, age DESC

    서브쿼리 안에 정렬조건을 넣으니 오류가 나서 바깥으로 빼주었습니다. power가 1인 지팡이가 하나만 출력됨으로써 우리가 원하는대로 결과가 잘 나오는 것을 확인할 수 있습니다.

 

서브쿼리 WHERE절에서 w.code = 1부분을 제거해주면 전체 테이블에 대한 결과를 얻을 수 있습니다.

 

 

 


📍본 내용은  '[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이'를  수강하며 작성한 내용입니다.

728x90
Comments