sql >> Databáze >  >> RDS >> Mysql

Jak vypočítat medián v MySQL

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.

  1. ORACLE - Vyberte počet na dílčím dotazu

  2. Jak získat hodnoty SQLite db v Arraylist do Listview

  3. Příkazy MySQL:Cheat Sheet of Common MySQL Queries

  4. 7 způsobů, jak vrátit všechny tabulky s primárním klíčem na SQL Server