Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara Menghitung Median di MySQL

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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa memeriksa jenis mesin MySQL untuk tabel tertentu?

  2. Bagaimana cara menulis pernyataan IF ELSE dalam kueri MySQL?

  3. Cara membubuhi keterangan bidang peningkatan otomatis MYSQL dengan anotasi JPA

  4. String pelarian nyata dan PDO

  5. Bagaimana cara memasukkan bingkai data panda melalui mysqldb ke dalam database?