it-swarm.dev

Jak znaleźć wartość mediany kolumny w MySQL?

Mogę sobie tylko wyobrazić, że robię to z dwoma zapytaniami do bazy danych. Pierwszy znajduje liczbę wierszy w bazie danych, a drugi wybiera za pomocą ORDER BY w kolumnie, którą jestem zainteresowany i LIMIT X, 1 gdzie X to połowa liczby rzędów.

Czy istnieje prosty sposób, aby to zrobić za pomocą tylko jednego zapytania?

W tej chwili używam średnich w moich obliczeniach, ale myślę, że średnia byłaby lepsza; wartości nie mają górnej granicy i są one ograniczone od dołu przez 0.


EDYCJA: tak, chciałem powiedzieć „mediana”, ale miałem jakiś błąd mózgu i szukałem „średniej”. Znalazłem odpowiedź na stackoverflow

10
JIStone

Jest sporo dyskusji tutaj na temat obliczania wartości mediany z tabeli MySQL. Wystarczy wyszukać na stronie „mediana”.

Nawiasem mówiąc, wydaje mi się, że nie mam wbudowanej funkcji, aby to zrobić. Mediana jest często bardziej opisowa niż tendencja centralna. Access/VBA ma ten sam otwór na liście funkcji.

6
Snubian

Nigdzie nie widziałem rozwiązania, które zdołałoby uzyskać medianę w jednym zapytaniu. Nie przeszkadza mi tabele tymczasowe, ale jeśli nie są konieczne, świetnie! Oto, co wymyśliłem:

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;

Przetestowałem to na parzysty zestaw i uzyskałem właściwą odpowiedź. brand_prof to tylko dwie kolumny: nazwa marki i zysk, wartość dziesiętna. Jeśli byłyby to liczby całkowite, być może trzeba rzucić „sufit ((CAST COUNT (*) AS DECIMAL) ...”) Więcej niż testowałem. Fajnym pomysłem na użycie produktu kartezjańskiego i powiązanie sumy znaków było nie moje. Niestety nie pamiętam autora.

2
Jeff Humphreys