Anda mungkin perlu menghitung median dari sekumpulan angka seperti penjualan, dll untuk menemukan nilai transaksi khas dari suatu variabel. Anda perlu menghitung median di MySQL menggunakan kueri SQL karena tidak ada fungsi untuk itu. Berikut query sederhana untuk menghitung median di MySQL.
Cara Menghitung Median di MySQL
Berikut langkah-langkah menghitung median di MySQL. Katakanlah Anda memiliki tabel berikut
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 | +------+------------+-------+
Katakanlah Anda ingin mencari skor median untuk tabel tersebut. Median adalah nilai item tengah dalam array angka yang telah diurutkan. Jika array memiliki jumlah item genap, maka median adalah rata-rata dari 2 nilai tengah.
Menghitung Median di MySQL
Berikut query SQL untuk menghitung median untuk kolom skor
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 | +------------+
Mari kita lihat kueri di atas secara detail. Kami menggunakan subquery SQL dalam kasus ini. Kueri dalam menetapkan @rownum sebagai indeks tambahan dan mengurutkan nilai yang dipilih. Di akhir pass pertama, @total_rows akan berisi jumlah baris dari baris yang dipilih. Kueri luar menggunakan @total_rows untuk menentukan median, terlepas dari apakah jumlah nilai ganjil atau genap.
Hitung median di MySQL setelah menerapkan filter
Katakanlah Anda ingin menghitung median hanya untuk nilai yang lebih besar dari 80 (>80). Anda dapat melakukannya hanya dengan menambahkan klausa where ke kueri Anda di atas, seperti yang ditunjukkan di bawah ini (kondisi filter disebutkan dalam tebal )
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 | +------------+
Cara Memplot Garis Median pada Grafik/Laporan
Katakanlah Anda ingin menampilkan nilai median di sepanjang nilai data sampingan pada laporan Anda. Dalam hal ini, Anda cukup melakukan cross join tabel hasil median Anda dengan tabel data asli Anda, seperti yang ditunjukkan di bawah ini.
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 | +------+------------+-------+------------+
Dalam kueri di atas, kami telah melakukan penggabungan silang antara ujian tabel dengan hasil kueri median (diberi label sebagai temp )
Berikut adalah contoh data di atas yang diplot pada diagram garis, dibuat menggunakan Ubiq.
Anda dapat menyesuaikan kueri di atas sesuai kebutuhan Anda untuk menghitung median di MySQL. FYI, MariaDB menyediakan fungsi MEDIAN() yang siap pakai untuk menghitung media untuk kolom nilai.
Jika Anda ingin membuat grafik, dasbor &laporan dari database MySQL, Anda dapat mencoba Ubiq. Kami menawarkan uji coba gratis selama 14 hari.