it-swarm-eu.dev

Jak najdu střední hodnotu sloupce v MySQL?

Umím si to představit pomocí dvou databázových dotazů. První najde počet řádků v databázi a druhý vybere pomocí ORDER BY ve sloupci, který mě zajímá a LIMIT X, 1 kde X je polovina počtu řádků.

Existuje jednoduchý způsob, jak to provést pouze s jedním dotazem?

Právě teď používám ve svých výpočtech průměry, ale myslím si, že průměr by byl lepší; neexistuje žádná horní hranice hodnot a jsou omezeny zdola 0.


EDIT: ano, chtěl jsem říct 'střední', ale měl jsem nějakou mozkovou chybu a hledal 'střední'. Nyní jsem našel odpověď na stackoverflow

10
JIStone

Existuje docela dost diskuse zde o výpočtu středních hodnot z tabulky MySQL. Hledejte na stránce „medián“.

Kromě toho mi připadá remissa, že pro to není vestavěná funkce. Medián často popisuje centrální tendenci než střední. Access/VBA má ve svém seznamu funkcí stejnou díru.

6
Snubian

Nikde jsem neviděl řešení, které by dokázalo získat medián v jediném dotazu. Nevadí mi dočasné tabulky, ale pokud to není nutné, skvělé! Tady je to, s čím jsem přišel:

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;

Testoval jsem to na rovnoměrnou sadu a dostal správnou odpověď. brand_prof jsou jen dva sloupce: brand_name a profit, desítková hodnota. Pokud by to byly celočíselné hodnoty, možná budete muset obsadit „strop ((CAST COUNT (*) AS DECIMAL) ...“) více, než jsem testoval. Skvělý nápad použít kartézský produkt a spojit součet znaků ne můj. Bohužel jsem na autora zapomněl.

2
Jeff Humphreys