Можете да изчислите медианата с GROUP BY в MySQL, въпреки че няма вградена функция за медиана.
Разгледайте таблицата:
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)
-
Булингдън също има 4 елемента. 2 е в диапазона 1..2 (стойност 300,00) и 2..3 (стойност 400,00)
-
Кардингтън има 5 елемента. Стойността 2,5 е между 2 и 3, което съответства на Cardington 151.
Средната стойност е средната стойност на минималните и максималните стойности, върнати от:
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