トップページに戻る    次のSQLパズルへ

2-3-1 モード(最頻値)を取得

SQLパズル

ModeTable
Col1
----
  10
  20
  20
  30
  30
  30
  40
  40
  40
  40
  50
  50
  50
  50
  60
  60
  60
  60

ModeTableの、
Col1の最頻値(最も多く存在する値)と、
最頻値のレコード数を取得する

出力結果
ModeVal  ModeCount
-------  ---------
    40           4
    50           4
    60           4


データ作成スクリプト

create table ModeTable(Col1 integer);

insert into ModeTable values
(10),
(20),
(20),
(30),
(30),
(30),
(40),
(40),
(40),
(40),
(50),
(50),
(50),
(50),
(60),
(60),
(60),
(60);
commit;


SQL

--■■■allを使う方法■■■
select Col1 as ModeVal,count(*) as ModeCount from ModeTable
group by Col1
having count(*) >= all(select count(*) from ModeTable group by Col1);

--■■■分析関数を使う方法■■■
select Col1,ModeCount
from (select Col1,
      count(*) as RecordCount,
      max(count(*)) over() as ModeCount
      from ModeTable
      group by Col1) dummy
where RecordCount = ModeCount
order by Col1;


解説

having句で、最も多く存在する値かをチェックする方法や、
分析関数を使う方法があります

allを使う方法では、
最初のクエリの、射影を返すクエリを、all述語の引数で使ってます

CodeZine:HAVING句の力