하루에 하나씩 공부하기
[해커랭크 Basic Join] Ollivander's Inventory (재도전) 본문
- 문제
POWER, AGE 그룹별 최소 COINS_NEEDED 한 ID, AGE, COINS_NEEDED, POWER 출력하기
Ollivander's Inventory | HackerRank
Ollivander's Inventory | HackerRank
Help pick out Ron's new wand.
www.hackerrank.com
- 키포인트
GROUP BY 에 AGE와 POWER만 있고, COIN은 MIN으로 처리한다해도 ID는 어떻게 출력하지?
>> 빠르게 GROUP BY 포기하고 윈도우함수나 서브쿼리 사용!
- 쿼리
SELECT A.ID, B.AGE, A.COINS_NEEDED, A.POWER
FROM WANDS A
JOIN WANDS_PROPERTY B ON A.CODE = B.CODE
WHERE B.IS_EVIL = 0
AND A.COINS_NEEDED = (
SELECT MIN(A2.COINS_NEEDED)
FROM WANDS A2
JOIN WANDS_PROPERTY B2 ON A2.CODE = B2.CODE
WHERE B2.IS_EVIL = 0
AND A2.POWER = A.POWER
AND B2.AGE = B.AGE
)
ORDER BY A.POWER DESC, B.AGE DESC;
GROUP BY를 A2.POWER=A.POWER, B2.AGE=B.AGE로 사용
- 다른 풀이
SELECT ID, AGE, COINS_NEEDED, POWER
FROM (SELECT A.ID, B.AGE, A.COINS_NEEDED, A.POWER,
ROW_NUMBER() OVER (PARTITION BY A.POWER, B.AGE ORDER BY A.COINS_NEEDED ASC, A.ID ASC) AS CN
FROM WANDS A
JOIN WANDS_PROPERTY B ON A.CODE = B.CODE
WHERE B.IS_EVIL=0
)
WHERE CN=1
ORDER BY POWER DESC, AGE DESC;
윈도우 함수 사용했는데 MySQL 8.X 이상 버전에서만 가능