mysqlには中央値を出す関数がない。
中央値のロジックを分解すると、
- データを昇順(もしくは降順)に並べて
- ちょうど真ん中のサンプルを取得
ということになる。
そのロジックを素直に実装した例をしめす。
以下サンプルデータ。
mysql> select * from users order by age ;
+---------+-----+
| name | age |
+---------+-----+
| john | 20 |
| ringo | 20 |
| george | 22 |
| paul | 29 |
| pete | 39 |
+---------+-----+
年齢の中央値を出すためのSQLがこちら。
PREPARE SET_STMT FROM 'select age from users order by age limit 1 offset ?';
SELECT FLOOR( COUNT(*) / 2 ) INTO @offset FROM users;
EXECUTE SET_STMT USING @offset;
実行結果
+-----+
| age |
+-----+
| 22 |
+-----+
解説
- ちょうど真ん中のレコードまでオフセットをずらして1行取得する
- そのオフセットの数とは、レコードの件数の半分の位置
5件のレコードなら、オフセットは2にして3件目を取得したい。そこで、レコードの件数を2で割ってあまりを切り捨てている。偶数のときには、前後のレコードから平均を取るというのが中央値の正しいルールだが、このロジックでは横着して件数が偶数のときには若い方だけをサンプルにしている。