16bit!

エンジニアじゃなくなっちゃった人が何かを書くブログ

【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!