Як знайти середнє значення стовпця в MySQL?


10

Я можу лише уявити собі це за допомогою двох запитів до бази даних. Перший знаходить кількість рядків у базі даних, а другий вибирає за допомогою ORDER BYстовпця, який мене цікавить, і LIMIT X, 1де X - половина кількості рядків.

Чи є простий спосіб зробити це лише одним запитом?

Зараз я використовую середні показники у своїх розрахунках, але думаю, що середнє значення буде кращим; немає верхньої межі значень і вони обмежені знизу 0.


EDIT: так, я мав на увазі сказати "середню", але мав помилку в мозку і шукав "середній". Зараз я знайшов відповідь у stackoverflow


Прочитавши metaтрохи, здається, існує розділ щодо погоди, це питання повинно бути тут або в ТАК. Я усвідомлюю, що це може бути не запит рівня ніндзя , але це мене змусило, і в компанії, в якій я працюю, немає DBA (всього 6 осіб).
JIStone

Відповіді:


6

Існує досить багато дискусій тут на обчислення медіани значень з таблиці MySQL. Просто перейдіть на сторінку "медіана".

Як бік, мені здається, що я відкидаю, що для цього немає вбудованої функції. Медіана часто більше описує центральну тенденцію, ніж середню. Access / VBA має такий самий отвір у своєму списку функцій.


Я згоден. Коли ви працюєте над великим запитом, додаткові рядки просто роблять всю справу більш громіздкою та важкою налагоджувати / підтримувати.
JIStone

2

Я ніде не бачив рішення, яке вдається отримати медіану в одному запиті. Я не проти темп-таблиць, але якщо вони не потрібні, чудово! Ось що я придумав:

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;

Я перевірив це на рівний набір і отримав правильну відповідь. brand_prof - це лише два стовпці: ім'я торгової марки та прибуток, десяткове значення. Якщо це цілі значення, вам, можливо, доведеться привести "стелю ((CAST COUNT (*) AS AS DECIMAL) ..." Більше, ніж я тестував. Я не забув автора, на жаль.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.