Možná budete muset vypočítat medián množiny čísel, jako jsou tržby atd., abyste našli typickou transakční hodnotu proměnné. Medián v MySQL musíte vypočítat pomocí SQL dotazů, protože pro to neexistuje žádná funkce. Zde je jednoduchý dotaz na výpočet mediánu v MySQL.
Jak vypočítat medián v MySQL
Zde jsou kroky pro výpočet mediánu v MySQL. Řekněme, že máte následující tabulku
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 | +------+------------+-------+
Řekněme, že chcete zjistit střední skóre pro tabulku. Medián je hodnota prostřední položky v poli čísel, která byla seřazena. Pokud má pole sudý počet položek, pak je medián průměrem prostředních 2 hodnot.
Vypočítejte medián v MySQL
Zde je dotaz SQL pro výpočet mediánu pro sloupec skóre
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 | +------------+
Podívejme se na výše uvedený dotaz podrobně. V tomto případě používáme poddotaz SQL. Vnitřní dotaz přiřadí @rownum jako přírůstkový index a seřadí vybrané hodnoty. Na konci prvního průchodu bude @total_rows obsahovat počet vybraných řádků. Vnější dotaz používá @total_rows k určení mediánu, bez ohledu na to, zda existuje lichý nebo sudý počet hodnot.
Vypočítat medián v MySQL po použití filtru
Řekněme, že chcete vypočítat medián pouze pro hodnoty, které jsou větší než 80 (>80). Můžete to udělat jednoduše přidáním klauzule where do vašeho dotazu výše, jak je znázorněno níže (podmínka filtru je uvedena tučně )
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 | +------------+
Jak vykreslit střední čáru v grafu/přehledu
Řekněme, že chcete v přehledu zobrazit hodnotu mediánu vedle hodnot dat. V takovém případě můžete jednoduše provést křížové spojení tabulky mediánových výsledků s původní tabulkou dat, jak je uvedeno níže.
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 | +------+------------+-------+------------+
Ve výše uvedeném dotazu jsme provedli křížové spojení mezi zkouškami tabulka s výsledkem mediánu dotazu (označená jako temp )
Zde je příklad výše uvedených dat vykreslených na spojnicovém grafu vytvořeném pomocí Ubiq.
Výše uvedené dotazy můžete přizpůsobit podle svého požadavku na výpočet mediánu v MySQL. Pro informaci, MariaDB poskytuje přednastavenou funkci MEDIAN() pro výpočet média pro sloupec hodnot.
Pokud chcete vytvářet grafy, dashboardy a sestavy z databáze MySQL, můžete zkusit Ubiq. Nabízíme 14denní bezplatnou zkušební verzi.