MySQL Агрегатная функция в другой агрегатной функции - PullRequest
1 голос
/ 12 июля 2011

У меня есть стол с сообщениями. Как (id int, date datetime). Как выбрать среднее количество сообщений в день для каждого месяца с одним запросом sql?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Это должно сделать это для вас:

select month, avg(posts_per_day)
from (select day(date), month(date) as month, count(*) as posts_per_day
      from posts group by 1,2) x
group by 1

Объяснение: Поскольку вы выполняете агрегат в агрегате, вы не можете обойтись без выполнения запроса:

  • Внутренний запрос вычисляет число в день и фиксирует месяц.
  • Внешний запрос усредняет это число, группируя по месяцам.
0 голосов
/ 12 июля 2011

Вы можете получить количество сообщений в месяц, например:

SELECT COUNT(*) AS num_posts_per_month FROM table GROUP BY MONTH(date);

Теперь нам нужно количество дней в месяце:

SELECT COUNT(*) / DATEDIFF(MAKEDATE(YEAR(date), MONTH(date)) + INTERVAL 1 MONTH, MAKEDATE(YEAR(date), MONTH(date))) AS avg_over_month
FROM table GROUP BY MONTH(date);

Получит среднее количество сообщений в день в течение календарного месяца сообщения. То есть средние значения за текущий месяц будут продолжать расти до конца месяца. Если вы хотите получить средние значения за текущий месяц, вы должны поставить условное выражение, чтобы получить истинное количество прошедших дней.

...