SORU
18 AĞUSTOS 2009, Salı


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
31 AĞUSTOS 2011, ÇARŞAMBA


Ö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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • Official Clouds

    Official Clo

    1 HAZİRAN 2011
  • Valdorsha

    Valdorsha

    8 Mayıs 2006