Sie können den Median mit GROUP BY in MySQL berechnen, obwohl keine Median-Funktion eingebaut ist.
Betrachten Sie die Tabelle:
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
Für jede Zeile können Sie die Anzahl ähnlicher Elemente zählen, die weniger sind. Sie können auch zählen, wie viele Werte kleiner oder gleich sind:
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
Mit Abfrage
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
Der Medianwert tritt auf, wenn die Kleiner-oder-gleich-Zählung die Hälfte der Anzahl der Elemente ist
-
Acrington hat 4 Artikel. Die Hälfte davon ist 2, was im Bereich 0..2 (entspricht 200,00) und auch im Bereich 2..3 (entspricht 300,00) liegt
-
Bullington hat auch 4 Artikel. 2 liegt im Bereich 1..2 (Wert 300,00) und 2..3 (Wert 400,00)
-
Karton hat 5 Artikel. Der Wert 2,5 liegt zwischen 2 und 3, was Cardington 151 entspricht.
Der Medianwert ist der Mittelwert der Min- und Max-Werte, die zurückgegeben werden von:
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
Was ergibt:
Acrington 200.00
Acrington 200.00
Acrington 300.00
Bulingdon 300.00
Bulingdon 400.00
Cardington 151.00
Endlich können wir den Median erhalten:
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
Geben
Acrington 250.000000
Bulingdon 350.000000
Cardington 151.000000