メジアン関数が組み込まれていない場合でも、MySQL の GROUP BY でメジアンを計算できます。
次の表を検討してください。
Acrington 200.00
Acrington 200.00
Acrington 300.00
Acrington 400.00
Bulingdon 200.00
Bulingdon 300.00
Bulingdon 400.00
Bulingdon 500.00
Cardington 100.00
Cardington 149.00
Cardington 151.00
Cardington 300.00
Cardington 300.00
各行について、より少ない類似アイテムの数を数えることができます。以下の値の数を数えることもできます。
name v < <=
Acrington 200.00 0 2
Acrington 200.00 0 2
Acrington 300.00 2 3
Acrington 400.00 3 4
Bulingdon 200.00 0 1
Bulingdon 300.00 1 2
Bulingdon 400.00 2 3
Bulingdon 500.00 3 4
Cardington 100.00 0 1
Cardington 149.00 1 2
Cardington 151.00 2 3
Cardington 300.00 3 5
Cardington 300.00 3 5
クエリあり
SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
, (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
FROM sale o
中央値は、より小さいか等しい数がアイテム数の半分の場合に発生します
アクリントンには 4 個のアイテムがあります。この半分は 2 で、範囲 0..2 (200.00 に相当) と範囲 2..3 (300.00 に相当) にあります。
Bullingdonには4つのアイテムがあります。2 の範囲は 1..2 (値 300.00) から 2..3 (値 400.00) です。
カーディントンには 5 個のアイテムがあります。値 2.5 は、カーディントン 151 に対応する 2 から 3 の間です。
中央値は、以下によって返される最小値と最大値の平均です。
SELECT cs.name,v
FROM
(SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
, (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
FROM sale o) cs JOIN
(SELECT name,COUNT(1)*.5 as cn
FROM sale
GROUP BY name) cc ON cs.name=cc.name
WHERE cn between ls and lse
これにより、次のことが得られます。
Acrington 200.00
Acrington 200.00
Acrington 300.00
Bulingdon 300.00
Bulingdon 400.00
Cardington 151.00
最後に、中央値を取得できます。
SELECT name,(MAX(v)+MIN(v))/2 FROM
(SELECT cs.name,v
FROM
(SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
, (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
FROM sale o) cs JOIN
(SELECT name,COUNT(1)*.5 as cn
FROM sale
GROUP BY name) cc ON cs.name=cc.name
WHERE cn between ls and lse
) AS medians
GROUP BY name
与える
Acrington 250.000000
Bulingdon 350.000000
Cardington 151.000000