MySQL ile basit bir şekilde medyan hesaplamak için
MySQL ile medyan hesaplamak için (ve umarım çok yavaş değil) en kolay yolu nedir? Ortalamasını bulmak için AVG(x)
kullandım, ama zor bir zaman medyan hesaplamak için basit bir yol bulamıyorum. Şimdilik, tüm satırları, bir şeyler yapıyor, ve sonra orta sırasındaki çekme PHP için geri veriyorum, ama kesinlikle tek bir MySQL sorguda bunu yapmanın basit bir yolu olmalı.
Örnek veri:
id | val
--------
1 4
2 7
3 2
4 2
5 9
6 8
7 3
val
sıralama medyan = = 9 ** karşı SELECT AVG(val)
4
, yani 2 2 3 4 7 8 9
verir.
CEVAP
Önerilen çözüm (TheJacobTaylor) sorunu zamanı. Kendisi için masaya katılmak büyük veri için pekmez gibi yavaş. Benim önerilen alternatif çalışır mysql, harika çalışma zamanı kullanır açık bir EMİR TARAFINDAN yapılan açıklama, bu yüzden gerek yok umarım dizinler sipariş vermek doğru düzgün bir sonuç ve kolay göz önüne sermek sorgusu için hata ayıklama.
SELECT avg(t1.val) as median_val FROM (
SELECT @rownum:=@rownum 1 as `row_number`, d.val
FROM data d, (SELECT @rownum:=0) r
WHERE 1
-- put some where clause here
ORDER BY d.val
) as t1,
(
SELECT count(*) as total_rows
FROM data d
WHERE 1
-- put same where clause here
) as t2
WHERE 1
AND t1.row_number in ( floor((total_rows 1)/2), floor((total_rows 2)/2) );
[Düzenle] Ortalama() t1 ekledi.ve(...) val row_number doğru kayıtların bir çift sayı olduğunda bir ortalama üretmek için. Akıl:
SELECT floor((3 1)/2),floor((3 2)/2);#total_rows is 3, so avg row_numbers 2 and 2
SELECT floor((4 1)/2),floor((4 2)/2);#total_rows is 4, so avg row_numbers 2 and 3
Eğer bir satır varsa, en iyi şekilde t...
Python ile basit bir şekilde bir dizi ...
'ne s/C En basit şekilde bir bit ...
Hızlı bir şekilde hesaplamak için 128-...
Bir şekilde Android üzerinde Python ça...