ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL指南書 HAVING句③ 自己結合でメジアンを求める

SQL 指南書集 目次 - ray88’s diary
SQL指南書 HAVING句③の補足(SQL文詳細解説) - ray88’s diary
メジアン(中央値・中位位)
 平均値が信用できない場合、最頻値と並んで良く使用される指標にメジアンがある
 母集合のデータを昇順に並べてちょうど中央に来た値。
 データの個数が偶数の場合は中央の2つの平均を取る

■例題
卒業生テーブル graduates の 給与の中央値を求める

SQLメジアンを考える(集合指向的にメジアンを考える)際のポイント
 ・母集合を上位と下位の2つの集合に分割する
 ・分割する際に2つの集合が中央の値を共有するようにしておく
 ・中央の値を共有することにより共通部分の値がメジアンとなる


SQL
SQL文の詳細の解説はこちらを参照

--メジアンを求めるSQL:自己非等値結合をHAVING句で使う
SELECT AVG(DISTINCT income)
FROM (
    SELECT T1.income
    FROM graduates T1, graduates T2
    GROUP BY T1.income
    --下位半分の条件
    HAVING SUM(CASE WHEN T2.income >= T1.income THEN 1 ELSE 0 END)
    >= COUNT(*)/2
    --上位半分の条件
    AND SUM(CASE WHEN T2.income <= T1.income THEN 1 ELSE 0 END)
    >= COUNT(*)/2
) AS TMP;