Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak obliczyć medianę w MySQL

Może być konieczne obliczenie mediany zestawu liczb, takich jak sprzedaż itp., aby znaleźć typową wartość transakcyjną zmiennej. Musisz obliczyć medianę w MySQL za pomocą zapytań SQL, ponieważ nie ma dla niej funkcji. Oto proste zapytanie do obliczenia mediany w MySQL.

Jak obliczyć medianę w MySQL

Oto kroki, aby obliczyć medianę w MySQL. Załóżmy, że masz poniższą 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  |
+------+------------+-------+

Załóżmy, że chcesz znaleźć medianę wyniku dla tabeli. Mediana to wartość środkowego elementu w tablicy liczb, która została posortowana. Jeśli tablica ma parzystą liczbę elementów, mediana jest średnią z dwóch środkowych wartości.

Oblicz medianę w MySQL

Oto zapytanie SQL do obliczenia mediany dla kolumny wyniku

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

Przyjrzyjmy się szczegółowo powyższemu zapytaniu. W tym przypadku używamy podzapytania SQL. Zapytanie wewnętrzne przypisuje @rownum jako indeks przyrostowy i sortuje wybrane wartości. Pod koniec pierwszego przebiegu @total_rows będzie zawierać liczbę wybranych wierszy. Zapytanie zewnętrzne wykorzystuje @total_rows do określenia mediany, niezależnie od tego, czy istnieje nieparzysta czy parzysta liczba wartości.

Oblicz medianę w MySQL po zastosowaniu filtra

Załóżmy, że chcesz obliczyć medianę tylko dla wartości większych niż 80 (>80). Możesz to zrobić, dodając klauzulę WHERE do powyższego zapytania, jak pokazano poniżej (warunek filtrowania zaznaczony pogrubieniem )

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 wykreślić linię środkową na wykresie/raporcie

Załóżmy, że chcesz wyświetlić medianę wartości obok wartości danych pobocznych w raporcie. W takim przypadku możesz po prostu wykonać połączenie krzyżowe średniej tabeli wyników z oryginalną tabelą danych, jak pokazano poniżej.

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

W powyższym zapytaniu wykonaliśmy połączenie krzyżowe między egzaminami tabela z wynikiem zapytania o medianę (oznaczona jako temp )

Oto przykład powyższych danych wykreślonych na wykresie liniowym, utworzonym za pomocą Ubiq.

Możesz dostosować powyższe zapytania zgodnie z wymaganiami dotyczącymi obliczania mediany w MySQL. FYI, MariaDB udostępnia niestandardową funkcję MEDIAN() do obliczania mediów dla kolumny wartości.

Jeśli chcesz tworzyć wykresy, dashboardy i raporty z bazy danych MySQL, możesz wypróbować Ubiq. Oferujemy 14-dniowy bezpłatny okres próbny.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd klucza obcego MySQL 1005 errno 150 klucz podstawowy jako klucz obcy

  2. Jak przeprowadzić wyszukiwanie z uwzględnieniem akcentu w MySql

  3. Przewodnik po projektowaniu bazy danych dla RBAC w MySQL

  4. Jak przywrócić pojedynczą tabelę MySQL za pomocą mysqldump?

  5. Zrozumienie widoków w SQL