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

So berechnen Sie den Median in MySQL

Möglicherweise müssen Sie den Median einer Reihe von Zahlen wie Verkäufen usw. berechnen, um den typischen Transaktionswert einer Variablen zu ermitteln. Sie müssen den Median in MySQL mit SQL-Abfragen berechnen, da es dafür keine Funktion gibt. Hier ist eine einfache Abfrage zur Berechnung des Medians in MySQL.

So berechnen Sie den Median in MySQL

Hier sind die Schritte zur Berechnung des Medians in MySQL. Angenommen, Sie haben die folgende Tabelle

CREATE TABLE exams (
id int(11) NOT NULL auto_increment,
dt date,
score int,
PRIMARY KEY (id)
);

insert into exams (dt,score) values ('2019-01-01',70);
insert into exams (dt,score) values ('2019-02-01',77);
insert into exams (dt,score) values ('2019-03-01',71);
insert into exams (dt,score) values ('2019-04-01',70);

insert into exams (dt,score) values ('2019-05-01',89);
insert into exams (dt,score) values ('2019-06-01',87);
insert into exams (dt,score) values ('2019-07-01',88);
insert into exams (dt,score) values ('2019-08-01',89);

mysql> select * from exams;
+------+------------+-------+
| id   |     dt     | score |
+------+------------+-------+
|   1  | 2019-01-01 |   70  |
|   2  | 2019-02-01 |   77  |
|   3  | 2019-03-01 |   71  |
|   4  | 2019-04-01 |   70  |
|   5  | 2019-05-01 |   89  |
|   6  | 2019-06-01 |   87  |
|   7  | 2019-07-01 |   88  |
|   8  | 2019-08-01 |   89  |
+------+------------+-------+

Angenommen, Sie möchten den Mittelwert für die Tabelle ermitteln. Der Median ist der Wert des mittleren Elements in einem sortierten Zahlenfeld. Wenn das Array dann eine gerade Anzahl von Elementen hat, ist der Median der Durchschnitt der mittleren 2 Werte.

Median in MySQL berechnen

Hier ist die SQL-Abfrage zur Berechnung des Medians für die Ergebnisspalte

SELECT AVG(dd.score) as median_val
FROM (
SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
  FROM exams d, (SELECT @rownum:=0) r
  WHERE d.score is NOT NULL
  -- put some where clause here
  ORDER BY d.score
) as dd
WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) );

+------------+
| median_val |
+------------+
|    82.00   |
+------------+

Schauen wir uns die obige Abfrage im Detail an. Wir verwenden in diesem Fall eine SQL-Unterabfrage. Die innere Abfrage weist @rownum als inkrementellen Index zu und sortiert die ausgewählten Werte. Am Ende des ersten Durchgangs enthält @total_rows die Zeilenanzahl der ausgewählten Zeilen. Die äußere Abfrage verwendet @total_rows, um den Median zu bestimmen, unabhängig davon, ob es eine ungerade oder gerade Anzahl von Werten gibt.

Median in MySQL nach Anwendung des Filters berechnen

Angenommen, Sie möchten den Median nur für Werte berechnen, die größer als 80 (>80) sind. Sie können dies tun, indem Sie einfach eine where-Klausel zu Ihrer obigen Abfrage hinzufügen, wie unten gezeigt (Filterbedingung in fett erwähnt )

SELECT AVG(dd.score) as median_val
FROM (
SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
  FROM exams d, (SELECT @rownum:=0) r
  WHERE d.score is NOT NULL
  AND d.score>80
  ORDER BY d.score
) as dd
WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) );

+------------+
| median_val |
+------------+
|    88.50   |
+------------+

So zeichnen Sie die Medianlinie in einem Diagramm/Bericht

Angenommen, Sie möchten den Medianwert neben den Datenwerten in Ihrem Bericht anzeigen. In diesem Fall können Sie Ihre Median-Ergebnistabelle einfach mit Ihrer ursprünglichen Datentabelle verknüpfen, wie unten gezeigt.

select * from exams,
(
SELECT AVG(dd.score) as median_val
FROM (
SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
 FROM exams d, (SELECT @rownum:=0) r
 WHERE d.score is NOT NULL
 -- put some where clause here
 ORDER BY d.score
) as dd
WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) )
) temp;

+------+------------+-------+------------+
| id   |     dt     | score | median_val |
+------+------------+-------+------------+
|   1  | 2019-01-01 |   70  |   82.0000  |
|   2  | 2019-02-01 |   77  |   82.0000  |
|   3  | 2019-03-01 |   71  |   82.0000  |
|   4  | 2019-04-01 |   70  |   82.0000  |
|   5  | 2019-05-01 |   89  |   82.0000  |
|   6  | 2019-06-01 |   87  |   82.0000  |
|   7  | 2019-07-01 |   88  |   82.0000  |
|   8  | 2019-08-01 |   89  |   82.0000  |
+------+------------+-------+------------+

In der obigen Abfrage haben wir einen Cross Join zwischen Prüfungen durchgeführt Tabelle mit dem Ergebnis der Median-Abfrage (gekennzeichnet als temp )

Hier ist ein Beispiel für die obigen Daten in einem Liniendiagramm, das mit Ubiq erstellt wurde.

Sie können die obigen Abfragen gemäß Ihren Anforderungen zur Berechnung des Medians in MySQL anpassen. FYI, MariaDB bietet eine sofort einsatzbereite Funktion MEDIAN() zum Berechnen von Medien für eine Wertespalte.

Wenn Sie Diagramme, Dashboards und Berichte aus einer MySQL-Datenbank erstellen möchten, können Sie Ubiq ausprobieren. Wir bieten eine 14-tägige kostenlose Testversion an.