Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden von MEDIAN zusammen mit MAX-, MIN- und AVG-Funktionen in MySQL

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