[HackerRank] Ollivander's Inventory

주연·2023년 4월 26일
0

SQL 문제 풀이

목록 보기
24/28
post-thumbnail

문제

hackerrank.com/challenges/harry-potter-and-wands/problem

구해야하는 결과:
1. code, power가 같은 galleons 중 coins_needed가 가장 작은 값인(가장 싼) galleons, 조건: is_evil=0
2. 1.에 해당하는 query(column: id, age, coins_needed, and power),
power순으로 내림차순, 같으면 age 순으로 내림차순

풀이

  • 내가 품
SELECT id, req.age, req.coins_needed, req.power --2.
FROM Wands
    INNER JOIN ( --1.
        SELECT Wands.code, age, power, MIN(coins_needed) coins_needed
        FROM Wands, Wands_Property
        WHERE Wands.code = Wands_Property.code AND is_evil = 0
        GROUP BY Wands.code, age, power) AS req 
    ON Wands.coins_needed = req.coins_needed AND Wands.code = req.code
ORDER BY POWER DESC, AGE DESC
  • 풀이 확인
    MS SQL Server에서 실행.
    HackerRank의 MYSQL은 구버전이라서 WINDOW함수가 안되기 때문
SELECT id, age, coins_needed, power
FROM (
  SELECT w.id
      , wp.age
      , w.coins_needed
      , w.power
      , ROW_NUMBER() OVER (PARTITION BY age, power ORDER BY coins_needed) rn
  FROM Wands w
      INNER JOIN Wands_Property wp ON w.code = wp.code 
  WHERE is_evil = 0
) t
WHERE rn = 1
ORDER BY POWER DESC, AGE DESC

풀이 확인한 쿼리가 속도가 더 빠르다.
나는 INNER JOIN을 두 번 사용한 반면 한 번만 사용해서 그런 듯하다.
앞으로 문제를 푸는데 ROW_NUMBER를 잘 활용해봐야겠다!!

profile
공부 기록

0개의 댓글