Как найти среднее значение столбца в MySQL?

10

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

Есть ли простой способ сделать это только с одним запросом?

Прямо сейчас я использую средние в своих вычислениях, но я думаю, что среднее было бы лучше; верхняя граница значений отсутствует, и снизу они ограничены 0.


РЕДАКТИРОВАТЬ: да, я хотел сказать «медиана», но имел некоторые ошибки мозга и искал «среднее». Теперь я нашел ответ в stackoverflow

JIStone
источник
После прочтения metaнемного кажется, что есть разделение относительно погоды, этот вопрос должен быть здесь или в SO. Я понимаю, что это может быть не запрос уровня ниндзя , но это поставило меня в тупик, и в компании, в которой я работаю, нет администратора баз данных (всего 6 человек).
JIStone

Ответы:

6

Существует довольно много дискуссий здесь на вычисление медианы значений из таблицы MySQL. Просто найдите на странице «медиана».

Кроме того, мне кажется упущением, что для этого нет встроенной функции. Медиана часто является более описательной для центральной тенденции, чем средняя. Access / VBA имеет такую ​​же дыру в своем списке функций.

Snubian
источник
Согласен. При работе с большим запросом дополнительные строки просто делают все это более громоздким и трудным для отладки / сопровождения.
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 - это просто два столбца: brand_name и прибыль, десятичное значение. Если бы это были целочисленные значения, вам, возможно, пришлось бы разыграть «потолок ((CAST COUNT (*) AS DECIMAL) ...» больше, чем я тестировал. Отличная идея использовать декартово произведение и связать сумму знаков была не мое. я забыл автора, к сожалению.

Джефф Хамфрис
источник