MySQL'de bir sütunun medyan değerini nasıl bulabilirim?


10

Sadece iki veritabanı sorguları ile bunu hayal edebiliyorum. Birincisi, veritabanındaki satır sayısını bulur ve ikincisi ORDER BY, ilgilendiğim sütunda bir ile seçilir ve LIMIT X, 1burada X, satır sayısının yarısıdır.

Bunu tek bir sorgu ile yapmanın basit bir yolu var mı?

Şu anda hesaplamalarda ortalamalar kullanıyorum, ama ortalamaların daha iyi olacağını düşünüyorum; değerlere üst sınır yoktur ve bunlar aşağıdan 0 ile sınırlanır.


EDIT: evet, 'medyan' demek istedim ama bazı beyin hataları vardı ve 'ortalama' aradı. Şimdi cevabı stackoverflow'da buldum


Biraz okuduktan sonra metahava durumu için bir bölüm var gibi görünüyor bu soru burada veya SO olmalıdır. Bunun ninja düzeyinde bir sorgu olmayabileceğini biliyorum , ama beni şaşırttı ve çalıştığım şirkette DBA yok (toplam 6 kişi).
JIStone

Yanıtlar:


6

Burada bir MySQL tablosundan ortanca değerlerin hesaplanması konusunda biraz tartışma var . Sadece 'medyan' sayfasını arayın.

Bir kenara, bana bunu yapmak için yerleşik bir fonksiyonun olmadığını hatırlattı. Medyan genellikle merkezi eğilimi ortalamadan daha açıklayıcıdır. Access / VBA işlev listesinde aynı deliğe sahiptir.


Katılıyorum. Büyük bir sorguda çalıştığında, ekstra satırlar her şeyi daha hantal ve hata ayıklamak / korumak zor hale getirir.
JIStone

2

Medyanı tek bir sorguda almayı başaran hiçbir yerde bir çözüm görmedim. Temp tabloları umrumda değil, ama gerekli değilse, harika! İşte ben geldim:

SELECT AVG(profit) median, nofitems FROM(
  SELECT x.profit, SUM(SIGN(1.0-SIGN(y.profit-x.profit))) diff, count(*) nofitems, floor(count(*)+1/2)
  FROM brand_prof x, brand_prof y
  GROUP BY x.profit
  HAVING SUM(SIGN(1.0-SIGN(y.profit-x.profit))) = floor((COUNT(*)+1)/2)
      OR SUM(SIGN(1.0-SIGN(y.profit-x.profit))) = ceiling((COUNT(*)+1)/2)
) x;

Bunu eşit bir set için test ettim ve doğru cevabı aldım. brand_prof yalnızca iki sütundur: marka_adı ve kâr, ondalık bir değer. Bu tamsayı değerler olsaydı, "ceiling ((CAST COUNT (*) DECIMAL) ..." test ettiğimden daha fazlasını yayınlamanız gerekebilir. Kartezyen bir ürün kullanmak ve işaretlerin toplamını ilişkilendirmek için harika bir fikir maalesef yazarı unuttum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.