sql >> データベース >  >> RDS >> PostgreSQL

特定の年に最も多くの賞を受賞した映画を探す-コードの重複

    一般的なテーブル式 を使用できます。 コードの重複を避けるために:

      with cte_s as(select id_movie、count(id_movie)as Awards from Award natural join Awardwinner where Award_year =2012 group by id_movie)select sub.id_movie、sub.awardsfrom cte_s as subwhere sub.awards =(select max (sub2.awards)from cte_s as sub2) 

    または、ウィンドウ関数 を使用してこのようなことを行うことができます。 (テストされていませんが、PostgreSQLではこれが可能だと思います):

      with cte_s as(select id_movie、count(id_movie)as Awards、max(count(id_movie))over()as max_awards from Award natural join Awardwinner where Award_year =2012 group by id_movie)select id_moviefrom cte_swhere max_awards =賞 

    これを行う別の方法は、rank()> 関数(テストされていない、1つではなく2つのcteを使用する必要があるかもしれません):

      with cte_s as(select id_movie、count(id_movie)as Awards、rank()over(order by count(id_movie)desc)as rnk from Award natural join Awardwinner where Award_year =2012 group by id_movie)select id_moviefrom cte_swhere rnk =1  

    更新 この回答を作成したときの私の主な目標は、cteを使用してコードの重複を回避する方法を示すことでした。一般的には、可能であれば、クエリでcteを複数回使用することは避けたほうがよいでしょう。最初のクエリは2つのテーブルスキャン(またはインデックスシーク)を使用し、2番目と3番目は1つだけを使用するので、これらのクエリ。とにかく、@Erwinは彼の答えでこのテストを行いました。彼の大きな主なポイントに追加するだけです:

    したがって、最終的なクエリは次のようになります。 select * from Award as a where a.id_award =aw.id_award and a.award_year =2012)group by aw.id_movie)select id_moviefrom cte_swhere rnk =1

    1. Oracle Linux Automation Manager(別名「OracleAnsibleTower」)のインストール方法

    2. このSQLステートメントの書き方は?

    3. Laravelのsave()メソッドの後にカスタムIDの主キーを取得できません

    4. SELECTステートメントでto_date例外を処理して、それらの行を無視するにはどうすればよいですか?