SQL 指南書集 目次 - ray88’s diary
SQL指南書 HAVING句③ 自己結合でメジアンを求める - ray88’s diary
■SQL文理解のため、いったんテーブル「graduates」を以下のような単純な値にして考察する
■SQL文で行っている作業ステップ
STEP1:以下のように「T1」と「T2」の2つの仮想テーブルを作成する
STEP2:「T1」と「T2」のテーブルの各値同士を比較し、
T1<=T2の条件に合致する値の個数、T1>=T2の条件に合致する値の個数を調べる
STEP3:T1<=T2 の条件に合致する個数とT1>=T2の条件に合致する値の個数の両方がそれぞれ
データの総数の半分(ここでは総データ件数「5」の半分の「2.5」)以上の値を調べる
STEP4:AVG(DISTINCT income)でSTEP3で抽出した値の平均を出して中央値とする
※データの総数が偶数の場合は2つの値が抽出されるため、平均を取って中央値とする
奇数の場合は抽出された値÷1となり、抽出された値がそのまま中央値となる。
--メジアンを求める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;