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
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를 잘 활용해봐야겠다!!