Du kan behöva beräkna medianen för en uppsättning siffror som försäljning etc för att hitta det typiska transaktionsvärdet för en variabel. Du måste beräkna median i MySQL med SQL-frågor eftersom det inte finns någon funktion för det. Här är en enkel fråga för att beräkna median i MySQL.
Hur man beräknar median i MySQL
Här är stegen för att beräkna median i MySQL. Låt oss säga att du har följande tabell
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 | +------+------------+-------+
Låt oss säga att du vill hitta medianpoängen för tabellen. Median är värdet på mittposten i en array av nummer som har sorterats. Om matrisen har ett jämnt antal objekt är medianen medelvärdet av de två mittersta värdena.
Beräkna median i MySQL
Här är SQL-frågan för att beräkna median för poängkolumnen
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 | +------------+
Låt oss titta på ovanstående fråga i detalj. Vi använder en SQL-underfråga i detta fall. Den inre frågan tilldelar @rownum som inkrementellt index och sorterar de valda värdena. I slutet av första passet kommer @total_rows att innehålla radantalet för valda rader. Den yttre frågan använder @total_rows för att bestämma medianen, oavsett om det finns udda eller jämna antal värden.
Beräkna median i MySQL efter applicering av filter
Låt oss säga att du bara vill beräkna median för värden som är större än 80 (>80). Du kan göra det genom att helt enkelt lägga till en where-klausul i din fråga ovan, som visas nedan (filtervillkor anges i fetstil )
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 | +------------+
Hur man ritar medianlinjen på grafen/rapporten
Låt oss säga att du vill visa medianvärdet vid sidan av datavärden i din rapport. I så fall kan du helt enkelt göra en korskoppling av din medianresultattabell med din ursprungliga datatabell, som visas nedan.
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 ovanstående fråga har vi gjort en korskoppling mellan prov tabell med resultatet av medianfrågan (märkt som temp )
Här är ett exempel på ovanstående data plottad på ett linjediagram, skapat med Ubiq.
Du kan anpassa ovanstående frågor enligt ditt krav för att beräkna median i MySQL. FYI, MariaDB tillhandahåller en out-of-the-box-funktion MEDIAN() för att beräkna media för en kolumn med värden.
Om du vill skapa diagram, instrumentpaneler och rapporter från MySQL-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.