본문 바로가기

코딩일기

SQL 코드카타 173 - Ollivander's Inventory

https://www.hackerrank.com/challenges/harry-potter-and-wands/problem?isFullScreen=true

 

Ollivander's Inventory | HackerRank

Help pick out Ron's new wand.

www.hackerrank.com

 

Column Type
id Integer
code Integer
coin_needed Integer
power Integer

 

Wands 테이블:

  • id : 지팡이의 id
  • code : 지팡이의 코드
  • coin_needed : 지팡이의 비용
  • power : 지팡이의 품질

 

Column Type
code  Integer
age Integer
is_evil Integer

 

Wands_Property 테이블:

  • code  : 지팡이의 코드
  • age : 지팡이의 연식
  • is_evil : 어둠의 마법 친화도

해리 포터와 그의 친구들은 론과 함께 찰리의 오래된 부러진 지팡이를 교체하기 위해 올리밴더의 가게에 와 있습니다.

헤르미온느는 높은 힘과 나이를 가진 악하지 않은 지팡이를 사기 위해 필요한 최소한의 금 갈레온 수를 결정하는 것이 가장 좋은 방법이라고 생각합니다. 론이 관심 있는 지팡이의 id, age, coins_needed, power를 출력하는 쿼리를 작성하세요. 결과는 힘의 내림차순으로 정렬하고, 힘이 같은 경우 나이의 내림차순으로 정렬합니다.

 

select *
from Wands w
left join Wands_Property wp on w.code = wp.code

 

먼저 지팡이의 코드에 따라 나이, 어둠의 마법 친화도를 함께 출력하도록한다.

 

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

 

지팡이들의 나이, 품질별로 가장 저렴한 품목만 출력하도록 한다.

 

select
    w.id,
    wp.age,
    w.coins_needed,
    w.power
from Wands w
left join Wands_Property wp on w.code = wp.code
where (wp.age, w.coins_needed, w.power) in
(select
    wp.age,
    min(w.coins_needed),
    w.power
from Wands w
left join Wands_Property wp on w.code = wp.code
group by wp.age, w.power)

 

위의 쿼리를 조건으로 해서 조건에 맞는 항목들만 출력하도록 한다. ONLY_FULL_GROUP_BY 때문으로 group by를 한 열만 select에서 출력할 수 있기 때문에 group by를 하지 않은 w.id 열을 출력하기 위함이다.

 

select
    w.id,
    wp.age,
    w.coins_needed,
    w.power
from Wands w
left join Wands_Property wp on w.code = wp.code
where wp.is_evil = 0
and (wp.age, w.coins_needed, w.power) in
(select
    wp.age,
    min(w.coins_needed),
    w.power
from Wands w
left join Wands_Property wp on w.code = wp.code
group by wp.age, w.power)

 

where 절에 조건을 추가한다. 악하지 않은 지팡이만 출력해야하므로 wp.is_evil = 0인 지팡이들만 골라낸다.

 

select
    w.id,
    wp.age,
    w.coins_needed,
    w.power
from Wands w
left join Wands_Property wp on w.code = wp.code
where wp.is_evil = 0
and (wp.age, w.coins_needed, w.power) in
(select
    wp.age,
    min(w.coins_needed),
    w.power
from Wands w
left join Wands_Property wp on w.code = wp.code
group by wp.age, w.power)
order by w.power desc, wp.age desc

 

마지막으로 주어진 조건에 맞게 정렬하면 완료!

 

ONLY_FULL_GROUP_BY 때문에 서브쿼리를 하나 더 작성해야해서 시간이 조금 걸렸다.