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.