SQL

[Hacker Rank] SQL_Intermediate_Medium (Left join)

jjanggun0930 2025. 2. 2. 00:18

난이도 : 중상

소요시간 : 1시간

[첫 번째 시도]

select w.id, p.age, w.coins_needed, w.power
from Wands as w
left join Wands_Property as p
    on w.code = p.code
order by w.power desc, p.age desc

 

오류의 원인은  같은 age, 같은 power를 지니면, 그 중 값 싼 제품을 선택해야한다는 것. 

이걸 대체 코드로 어떻게 나타내면 좋을까....

 

[두 번째 시도]

select w.id, p.age, min(w.coins_needed), w.power
from Wands as w
left join Wands_Property as p
    on w.code = p.code
group by p.age, w.power
order by w.power desc, p.age desc

 

이 코드에서 select 에 w.id를 빼면 원하는 대로 답이 나오긴하는데, id를 포함하면 또 오류가 나고....그렇다고 id를 그룹화에 넣으면 또 원하는 답은 안나오고....

 

도저히 ...... 이리저리 해봐도 안되길래 도움을 받았다...ㅎ

 

[정답 코드]

SELECT w.id, p.age, w.coins_needed, w.power
FROM Wands AS w
LEFT JOIN Wands_Property AS p
ON w.code = p.code
WHERE w.coins_needed IN (
    SELECT MIN(w1.coins_needed) 
    FROM Wands w1 
    WHERE w1.power = w.power 
    AND w1.code = w.code
)
AND p.is_evil = 0
ORDER BY w.power DESC, p.age DESC;

 

조건을 WHERE 절에 서브쿼리로 넣는 것. 

이때, 나도 이렇게 진행할 때 나는 group by 로 서브쿼리를 진행했는데, 계속 정답이 안됐었음. 

그 이유를 알고 보니, 조건 자체가 code 한개에 age 한개라는 조건이 있었음. 

이걸 group by 로 묶게 되면, 중복인 행들이 생겨서 갯수가 정답보다 더 많이 나왔던 것. 

 

WHERE w1.power = w.power
          AND w1.code = w.code  => 이걸 조건으로 중복인 행이 생기지 않도록 함

 

문제를... 꼭 다시읽고 또 읽고 한 번 더 보고...^^