cari

Rumah  >  Soal Jawab  >  teks badan

Cara mudah untuk mengira median dalam MySQL

<p>Apakah cara paling mudah (dan mudah-mudahan tidak terlalu perlahan) untuk mengira median menggunakan MySQL? Saya telah menggunakan <code>AVG(x)</code> untuk mencari min, tetapi saya menghadapi masalah mencari cara mudah untuk mengira median. Pada masa ini saya mengembalikan semua baris ke PHP, mengisih, dan kemudian memilih baris tengah, tetapi mesti ada cara mudah untuk melakukannya 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 mengikut <kod>val</kod> kita mendapat <kod>2 2 3 4 7 8 9</kod>, jadi median hendaklah <kod>4</kod>, bukan < ;kod>PILIH AVG(val)</kod> sama dengan <kod>5</kod>. </p>
P粉960525583P粉960525583509 hari yang lalu667

membalas semua(2)saya akan balas

  • P粉738248522

    P粉7382485222023-08-21 16:20:51

    Saya baru sahaja menemui jawapan lain dalam talian dalam ulasan:

    Pastikan lajur anda diindeks dengan baik dan indeks digunakan untuk menapis dan mengisih. Mengesahkan melalui pelan pelaksanaan.

    select count(*) from table --找到行数

    Kira nombor baris "median". Boleh digunakan: median_row = floor(count / 2).

    Kemudian pilih daripada senarai:

    select val from table order by val asc limit median_row,1

    Ini sepatutnya mengembalikan nilai yang anda inginkan.

    balas
    0
  • P粉195200437

    P粉1952004372023-08-21 13:39:20

    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
      -- 在这里放置一些条件语句
      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 atau gabungan kedua diperlukan.

    Selain itu, AVG(dd.val)dd.row_number IN(...) digunakan untuk mengira median dengan betul apabila bilangan rekod adalah genap. Alasannya adalah seperti berikut:

    SELECT FLOOR((3+1)/2),FLOOR((3+2)/2); -- 当total_rows为3时,平均行数为2和2
    SELECT FLOOR((4+1)/2),FLOOR((4+2)/2); -- 当total_rows为4时,平均行数为2和3

    Akhir sekali, MariaDB 10.3.3+ termasuk fungsi MEDIAN

    balas
    0
  • Batalbalas