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.