Rumah  >  Soal Jawab  >  teks badan

Cara mudah untuk mengira median dengan MySQL

<p>Apakah cara paling mudah (mudah-mudahan tidak terlalu perlahan) untuk mengira median menggunakan MySQL? Saya menggunakan <code>AVG(x)</code> untuk mencari min, tetapi saya menghadapi masalah mencari cara mudah untuk mengira median. Sekarang, saya mengembalikan semua baris ke PHP, menyusun, dan kemudian memilih baris tengah, tetapi mesti ada beberapa cara mudah untuk melakukan ini dalam satu pertanyaan MySQL. </p> <p>Contoh data:</p> <pre class="brush:php;toolbar:false;">id | -------- 1 4 2 7 3 2 4 2 5 9 6 8 7 3</pra> <p>Isih <kod>val</kod> memberikan <kod>2 2 3 4 7 8 9</kod>, jadi median hendaklah <kod>4</kod>, Dan <kod> ;PILIH AVG(val)</kod> == <kod>5</kod>. </p>
P粉720716934P粉720716934418 hari yang lalu766

membalas semua(2)saya akan balas

  • P粉041881924
  • P粉041758700

    P粉0417587002023-08-30 10:24:09

    Dalam MariaDB / MySQL:

    SELECT AVG(dd.val) as median_val
    FROM (
    SELECT d.val, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
      FROM data d, (SELECT @rownum:=0) r
      WHERE d.val is NOT NULL
      -- put some where clause here
      ORDER BY d.val
    ) as dd
    WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) );

    Steve Cohen menegaskan bahawa selepas hantaran pertama, @rownum akan mengandungi jumlah bilangan baris. Ini boleh digunakan untuk menentukan median, jadi tiada hantaran kedua atau gabungan diperlukan.

    Selain itu, AVG(dd.val)dd.row_number IN(...) digunakan untuk menjana median dengan betul apabila terdapat bilangan rekod genap. Alasan:

    SELECT FLOOR((3+1)/2),FLOOR((3+2)/2); -- when total_rows is 3, avg rows 2 and 2
    SELECT FLOOR((4+1)/2),FLOOR((4+2)/2); -- when total_rows is 4, avg rows 2 and 3

    Akhir sekali, MariaDB 10.3.3+ termasuk fungsi MEDIAN

    balas
    0
  • Batalbalas