【SQL】COUNTが最大のものだけを抽出する
CodeIQに珍しくSQLの問題があったので、休憩がてらちゃちゃっとやってみました。
挑戦者求む!10分で挑戦!最頻値をSQL出力! by CodeIQ運営事務局
要するに、特定のカラムでgroup byして、その中でCOUNTが最大のものだけを抽出しろという話。
select v.score, v.freq from (select score, count(*) as freq from feedback group by score) v where v.freq = (select max(cnt) from (select count(*) as cnt from feedback group by score));
で、最初に書いたのがこれ。
ほとんど同じ文が2箇所にありますね。気持ち悪い。そしてたぶん遅い。
select score, count(*) as freq from feedback group by score having count(*) = (select max(cnt) from (select count(*) as cnt from feedback group by score) v);
と、ここでhaving句を思い出して書いたのがこれ。
これだとサブクエリ(?ビュー作ってるところ)は1箇所にしかないので良いですね。
ただ、やってること自体はgroup by した2つのビューの比較なので、
正直上と下とで下の方が速いのかどうかは謎。
フィードバックを待つことにします。
以上。
とりあえずhavingとか使うの久しぶりだったのでちょっとメモしておきました。
おわり。
追記
フィードバック来ました。詳細はこちら。
【SQL】ALL, ANYの使い方 - 16bit!