Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

하루에 하나씩 공부하기

[해커랭크 Basic Join] Ollivander's Inventory (재도전) 본문

카테고리 없음

[해커랭크 Basic Join] Ollivander's Inventory (재도전)

dltaexox 2025. 9. 13. 02:07

- 문제

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 이상 버전에서만 가능