Дополнительно
MySQL Query GROUP По дням / месяцам / годам
Возможно ли, что я сделаю простой запрос, чтобы подсчитать, сколько записей у меня за определенный период времени, например, год, месяц или день, с полем 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
Иметь ежемесячную статистику.
Спасибо!
606
13
Проверьте функции даты и времени в MySQL .
Я попытался использовать приведенное выше утверждение «ГДЕ», я подумал, что оно правильное, поскольку никто не исправил его, но я ошибся; после некоторых поисков я обнаружил, что это правильная формула для оператора WHERE, поэтому код становится таким:
попробуй это
Функция EXTRACT (единица FROM date) лучше, поскольку используется меньшее группирование, и функция возвращает числовое значение.
Условие сравнения при группировании будет быстрее, чем функция DATE_FORMAT (которая возвращает строковое значение). Попробуйте использовать функцию | поле, которое возвращает нестроковое значение для условия сравнения SQL (ГДЕ, HAVING, ORDER BY, GROUP BY).
Если ваш поиск превышает несколько лет, и вы все еще хотите группировать ежемесячно, я предлагаю:
версия № 1:
версия № 2 (более эффективная) :
Я сравнил эти версии на большой таблице с 1 357 918 строками ([Tag: InnoDB]) и 2-я версия, кажется, имеет лучшие результаты.
версия1 (в среднем 10 исполнений) : 1,404 секунды < br / > версия2 (в среднем 10 исполнений) : 0,780 секунды < br / >
(Ключ
SQL_NO_CACHE
добавлен, чтобы предотвратить MySQL от CACHING к запросам.)Если вы хотите сгруппировать по дате в MySQL, используйте код ниже:
Надеюсь, это сэкономит время для тех, кто собирается найти эту ветку.
Если вы хотите фильтровать записи за определенный год (например,. 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)
..... группа по to_char (дата, 'YYY')
- > 1989.... группа по to_char (дата, 'MM')
- > 05.... группа по to_char (дата, 'DD')
--- > 23.... group by to_char (date, 'MON')
--- > MAY.... группа по to_char (дата, 'YY')
--- > 89