Birden fazla sayısal sütuna sahip büyük bir tabloya (siteler) sahibim - a'dan f'ye. (Bunlar, alexa, google, quantcast vb. Gibi farklı kuruluşların site sıralamalarıdır. Her birinin farklı bir aralığı ve biçimi vardır; bunlar dış DB'lerden düz dökümdür.)mysql: Bir satırda birden çok sütun üzerinde ortalama, boş değerleri yok sayıyor
Kayıtların çoğu için, bir veya daha fazla Bu sütunlar boştur, çünkü dış DB'nin verileri yoktur. Hepsi benim DB'imin farklı alt kümelerini kapsar.
Sütunun t ağırlıklı ortalamaları olması (her biri atandığım statik ağırlıklara sahip olmak), boş değerlerin yok sayılması (bunların herhangi birinde gerçekleşebilir), null olmadıkları sürece boş olmaları dışında .
Bunu, basit bir SQL hesaplamasıyla, uygulama kodunda yapmaktan veya boş değerlerin her bir permütasyonunu işlemek için blok halinde çok büyük çirkin bir yuva kullanmaktan ziyade yapmayı tercih ederim. (Daha fazla dış DB kaynağına ekledikçe, ortalama olarak artan bir sütun sayısına sahip olduğum göz önüne alındığında, bu, üstel olarak daha çirkin ve hataya eğilimli olacaktır.)
AVG'yi kullanırdım, ancak bu yalnızca grup tarafından ve bu bir kayıtta w /. Veriler semantik olarak null olabilir ve boş değerlerin yerine bir "ortalama" değerde ortalamak istemiyorum; Sadece verilerin bulunduğu sütunları saymak istiyorum.
Bunu yapmanın iyi bir yolu var mı?
İdeal olarak, istediğim, herhangi bir boş değerin yok sayıldığı ve hiçbir gruplamanın gerçekleşmediği UPDATE sites SET t = AVG(a*@a_weight,b*@b_weight,...)
gibi bir şeydir.
DÜZENLEME:
: Ben van en dayanan ve (gerektiğindea
zaten = iyi) bir şamandıra 0-1 (1, bu durumda normalize edildiğini varsayarak doğru ağırlıklı ortalamalar ekleyerek kullanarak sona erdi neler
UPDATE sites
SET t = (@a_weight * IFNULL(a, 0) + ...)/(IF(a IS NULL, 0, @a_weight) + ...)
WHERE (IF(a IS NULL, 0, 1) + ...) > 0
IFNULL, COALESCE için daha açık bir alternatif olduğunu düşünüyorum, ancak yaklaşık olarak eşdeğerdir. IF (IS NULL, 0,1), CASE'nizden benzer şekilde daha basittir. Aksi takdirde, bence istediğim herşeyi yapar - temelde boş sütunları sıfırlar ve paydayı çıkarırsınız, bu akıllıca bir şey ve düşünmem gereken bir şey. :-P – Sai