Можно ли сделать простой запрос, чтобы подсчитать, сколько записей у меня есть в определенный период времени, например, год, месяц или день, имея TIMESTAMP
поле, например:
SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR
Или даже:
SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH
Иметь ежемесячную статистику.
Спасибо!
GROUP BY record_date.MONTH
в вашем первом фрагменте кода?Ответы:
Проверьте дату и время функции в MySQL.
источник
SELECT count(*), record_date FROM anytable WHERE anytable.anycolumn = 'anycondition' GROUP BY YEAR(record_date), month(record_date);
примечание: record_date - это тип даты TIMESTAMPПримечание (прежде всего, для потенциальных downvoters). В настоящее время это может быть не так эффективно, как другие предложения. Тем не менее, я оставляю это как альтернативу, и еще одну, которая может помочь увидеть, насколько быстрее другие решения. (Поскольку вы не можете по-настоящему отличить быстрое от медленного до тех пор, пока не увидите разницу.) Кроме того, со временем могут быть внесены изменения в движок MySQL в отношении оптимизации, чтобы сделать это решение в некоторых (возможно, не очень). отдаленная) точка в будущем, чтобы стать вполне сопоставимой по эффективности с большинством других.
источник
EXTRACT()
могут быть более эффективными, чемDATE_FORMAT()
. (У меня нет MySQL для правильного тестирования.)Попробуй это
Функция EXTRACT (единица измерения от даты) лучше, так как используется меньшее количество группировок и функция возвращает числовое значение.
Условие сравнения при группировке будет быстрее, чем функция DATE_FORMAT (которая возвращает строковое значение). Попробуйте использовать функцию | поле, которое возвращает нестроковое значение для условия сравнения SQL (WHERE, HAVING, ORDER BY, GROUP BY).
источник
Я попытался использовать утверждение «ГДЕ» выше, я думал, что это правильно, так как никто не исправил его, но я был неправ; после некоторых поисков я обнаружил, что это правильная формула для оператора WHERE, поэтому код выглядит так:
источник
Если ваш поиск длится несколько лет, и вы все еще хотите группировать ежемесячно, я предлагаю:
Версия № 1:
Версия № 2 (более эффективная) :
Я сравнил эти версии на большой таблице с 1 357 918 строками (InnoDB), и вторая версия, кажется, имеет лучшие результаты.
версия 1 (в среднем 10 выполнений) : 1,404 секунды
версия 2 (в среднем 10 выполнений) : 0,780 секунды
(
SQL_NO_CACHE
ключ добавлен для предотвращения кэширования MySQL для запросов.)источник
GROUP BY YEAR(record_date)*100 + MONTH(record_date)
, но почему бы не проверитьGROUP BY YEAR(record_date), MONTH(record_date)
?*100
на версии № 2? Заранее спасибо.*100
доYEAR(record_date)*100 + MONTH(record_date) == DATE_FORMAT(record_date, '%Y%m')
Если вы хотите сгруппировать по дате в MySQL, используйте код ниже:
Надеюсь, что это сэкономит время для тех, кто собирается найти эту ветку.
источник
MONTH(record_date)
нескольким месяцам.Если вы хотите отфильтровать записи за определенный год (например, 2000), оптимизируйте это
WHERE
предложение следующим образом:Вместо:
Результаты были сгенерированы для таблицы, содержащей 300 тыс. Строк и индекс по столбцу даты.
Что касается
GROUP BY
пункта, я проверил три варианта с вышеупомянутой таблицей; Вот результаты:Последний является победителем.
источник
Полное и простое решение с аналогичным исполнением, но более короткой и более гибкой альтернативой, действующей в настоящее время:
источник
Если вы хотите получать ежемесячную статистику с количеством строк в месяц каждого года, упорядоченного по последнему месяцу, попробуйте следующее:
источник
Вы можете сделать это просто функцией Mysql DATE_FORMAT () в GROUP BY. Возможно, вы захотите добавить дополнительный столбец для большей ясности в некоторых случаях, например, когда записи охватывают несколько лет, а один и тот же месяц встречается в разные годы. Здесь так много вариантов, которые можно настроить. Пожалуйста, прочитайте это перед началом. Надеюсь, это будет очень полезно для вас. Вот пример запроса для вашего понимания
источник
Следующий запрос работал для меня в Oracle Database 12c Release 12.1.0.1.0
источник
Я предпочитаю оптимизировать выбор группы на один год следующим образом:
Таким образом, вы можете просто связать год один раз, например
'2009'
, с помощью именованного параметра, и вам не нужно беспокоиться о добавлении'-01-01'
или передаче по'2010'
отдельности.Кроме того , как предположительно мы только подсчет строк и
id
никогдаNULL
, я предпочитаю ,COUNT(*)
чтобыCOUNT(id)
.источник
.... group by to_char(date, 'YYYY')
-> 1989.... group by to_char(date,'MM')
-> 05.... group by to_char(date,'DD')
---> 23.... group by to_char(date,'MON')
---> МАЙ.... group by to_char(date,'YY')
---> 89источник