ray88’s diary

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

SQL指南書 HAVING句③の補足(SQL文詳細解説)

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」)以上の値を調べる


STEP4AVG(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;