Cara mudah untuk mengira median dalam MySQL
P粉960525583
P粉960525583 2023-08-20 18:05:23
0
2
652
<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粉960525583
P粉960525583

membalas semua(2)
P粉738248522

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.

P粉195200437

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan