sql >> Database >  >> RDS >> Mysql

Hoe de mediaan te berekenen in MySQL

Mogelijk moet u de mediaan van een reeks getallen, zoals verkopen, enz. berekenen om de typische transactiewaarde van een variabele te vinden. U moet de mediaan in MySQL berekenen met behulp van SQL-query's, omdat er geen functie voor is. Hier is een eenvoudige vraag om de mediaan in MySQL te berekenen.

De mediaan berekenen in MySQL

Hier zijn de stappen om de mediaan in MySQL te berekenen. Stel dat u de volgende tabel heeft

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  |
+------+------------+-------+

Stel dat u de mediaanscore voor de tabel wilt vinden. Mediaan is de waarde van het middelste item in een reeks getallen die is gesorteerd. Als de array een even aantal items heeft, is de mediaan het gemiddelde van de middelste 2 waarden.

Bereken de mediaan in MySQL

Dit is de SQL-query om de mediaan voor de scorekolom te berekenen

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   |
+------------+

Laten we de bovenstaande vraag in detail bekijken. We gebruiken in dit geval een SQL-subquery. De binnenquery wijst @rownum toe als incrementele index en sorteert de geselecteerde waarden. Aan het einde van de eerste doorgang bevat @total_rows het aantal rijen van geselecteerde rijen. De buitenste query gebruikt @total_rows om de mediaan te bepalen, ongeacht of er een oneven of even aantal waarden is.

Bereken mediaan in MySQL na toepassen filter

Stel dat u de mediaan wilt berekenen voor alleen waarden die groter zijn dan 80 (>80). U kunt dat doen door simpelweg een waar-clausule toe te voegen aan uw zoekopdracht hierboven, zoals hieronder weergegeven (filtervoorwaarde vermeld in vet )

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   |
+------------+

Hoe de mediaanlijn in grafiek/rapport te plotten

Stel dat u de mediaanwaarde naast de gegevenswaarden van de zijkant in uw rapport wilt weergeven. In dat geval kunt u eenvoudig een cross join maken tussen uw tabel met mediaanresultaten en uw originele gegevenstabel, zoals hieronder weergegeven.

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 de bovenstaande zoekopdracht hebben we een cross-join gedaan tussen examens tabel met het resultaat van mediaanquery (aangeduid als temp )

Hier is een voorbeeld van bovenstaande gegevens geplot op een lijndiagram, gemaakt met Ubiq.

U kunt de bovenstaande zoekopdrachten aanpassen aan uw vereisten om de mediaan in MySQL te berekenen. Ter informatie, MariaDB biedt een kant-en-klare functie MEDIAN() om media te berekenen voor een kolom met waarden.

Als u grafieken, dashboards en rapporten wilt maken vanuit de MySQL-database, kunt u Ubiq proberen. We bieden een gratis proefperiode van 14 dagen.

  1. Hoe om te gaan met fouten voor dubbele vermeldingen?

  2. UPDATE meerdere tabellen in MySQL met LEFT JOIN

  3. Een databasemodel ontwerpen voor een bioscoopreserveringssysteem

  4. 6 manieren om een ​​string te converteren naar een datum/tijd-waarde in SQL Server