2017-10-26 9 views
0

私は自分のSQLを教えようとしており、ハッカーの実践の質問をしています。私はOlivander's Inventoryの質問に出くわしました。次のように書かれています。Harry Potterと彼の友人たちは、OlivanderのRonと付き合っていて、ついにCharlieの古い壊れた棒を置き換えました。 Hermioneは、高力と年齢の悪でない杖を購入するのに必要な金ガレオンの最小数を決定することによって、最も良い選択方法を決める。 Ronが興味を持つワンドのid、age、coins_needed、powerを降順でソートして出力するためのクエリを作成します。複数のワンドに同じパワーがある場合は、降順にソートします。 Hereは詳細なリンクです。それは私の解決策には不満で、私はそれが特にグループと関係があると思っています。私がやったことに何が間違っていて、それをどうやって修正するのですか?それを修正するために同じ小さな修正を加えることができますか(つまり、group by節を使用していますか?)SQLでグループ化して最小のアグリゲータ(結合を使用)

Hermioneは、ハイパワーとエイジのそれぞれの悪でない杖を購入するのに必要な金ガレオンの最小数を決定することによって、最も良い選択方法を決定します。 Ronが興味を持つワンドのid、age、coins_needed、powerを降順でソートして出力するためのクエリを作成します。複数のワンドに同じパワーがある場合は、降順にソートします。

select w.id, wp.age, min(w.coins_needed), w.power 
from wands as w, wands_property as wp 
where w.code = wp.code and wp.is_evil = 0 
group by w.power, wp.age 
order by w.power desc, wp.age desc; 

私は提案をいただければ幸いです!ありがとう!

答えて

0

group by節と合わせてw.idと不幸です。基本的には、同じw.power, wp.ageペアリングに対応する複数のw.idが存在する可能性があります。あなたが望むものはminのエントリに対応するIDですが、それは(直接的な)法的SQLではありません。 minの代わりにavgを入力した場合はどうなりますか?

代わりに、サブクエリを使用します。

  1. 与えられたパワーと年齢のワンドを取得する最小のコイン数を決めます(私は1対1のマップであるため、コードを使用しています
  2. )参加回避)がgenerally preferredだから得られた最小価格サブセットすなわち(JOINを用いて、で

にフィルタリングおよび順序付けを行うことをワンド

  • に対応するIDを決定し、

    select w.id, wp.age, s.min_coins_needed, s.power 
    from (select code, power, min(coins_needed) as min_coins_needed 
        from wands 
        group by power, code) as s 
    left join wands w 
        on w.coins_needed = s.min_coins_needed and w.code = s.code and w.power = s.power 
    left join wands_property as wp 
        on w.code = wp.code 
    where wp.is_evil = 0 
    order by s.power desc, wp.age desc; 
    
  • 関連する問題