sql >> Database teknologi >  >> RDS >> Mysql

Sådan beregnes median i MySQL

Du skal muligvis beregne medianen af ​​et sæt tal, såsom salg osv. for at finde den typiske transaktionsværdi for en variabel. Du skal beregne medianen i MySQL ved hjælp af SQL-forespørgsler, da der ikke er nogen funktion til det. Her er en simpel forespørgsel til at beregne medianen i MySQL.

Sådan beregnes median i MySQL

Her er trinene til at beregne medianen i MySQL. Lad os sige, at du har følgende tabel

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

Lad os sige, at du vil finde median-score for tabellen. Median er værdien af ​​det midterste element i en række af tal, der er blevet sorteret. Hvis arrayet har lige antal elementer, er medianen gennemsnittet af de midterste 2 værdier.

Beregn median i MySQL

Her er SQL-forespørgslen til at beregne medianen for scorekolonnen

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

Lad os se på ovenstående forespørgsel i detaljer. Vi bruger en SQL-underforespørgsel i dette tilfælde. Den indre forespørgsel tildeler @rownum som trinvis indeks og sorterer de valgte værdier. Ved slutningen af ​​første gennemløb vil @total_rows indeholde rækkeantallet af valgte rækker. Den ydre forespørgsel bruger @total_rows til at bestemme medianen, uanset om der er ulige eller lige antal værdier.

Beregn medianen i MySQL efter anvendelse af filter

Lad os sige, at du kun vil beregne medianen for værdier, der er større end 80 (>80). Du kan gøre det ved blot at tilføje en where-klausul til din forespørgsel ovenfor, som vist nedenfor (filterbetingelse nævnt med fed )

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

Sådan plottes medianlinje på graf/rapport

Lad os sige, at du vil vise medianværdien ved siden af ​​dataværdier på din rapport. I så fald kan du blot lave en krydssammenføjning af din medianresultattabel med din originale datatabel, som vist nedenfor.

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

I ovenstående forespørgsel har vi lavet en krydsforbindelse mellem eksamener tabel med resultatet af medianforespørgsel (mærket som temp )

Her er et eksempel på ovenstående data plottet på et linjediagram, oprettet ved hjælp af Ubiq.

Du kan tilpasse ovenstående forespørgsler efter dit krav til at beregne medianen i MySQL. FYI, MariaDB leverer en out-of-the-box funktion MEDIAN() til at beregne medier for en kolonne med værdier.

Hvis du vil oprette diagrammer, dashboards og rapporter fra MySQL-databasen, kan du prøve Ubiq. Vi tilbyder en 14-dages gratis prøveperiode.

  1. Hvordan giver man position nul for spinner en promptværdi?

  2. Hvorfor svarer Oracles varchar-sorteringsrækkefølge ikke til varchar-sammenligningens adfærd?

  3. Dvale og Multi-Tenant Database ved hjælp af skemaer i PostgreSQL

  4. Ugyldig syntaksfejltype=MyISAM i DDL genereret af Hibernate