MySQL Query GROUP BY день / месяц / год

Возможно ли сделать простой запрос, чтобы подсчитать, сколько записей у меня есть в определенный период времени, например, год, месяц или день, с полем 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

Иметь ежемесячную статистику.

Спасибо!

вопрос задан 3.02.2009
Fernando Barrocal
6324 репутация

13 ответов


  • 852 рейтинг
    GROUP BY YEAR(record_date), MONTH(record_date)
    

    Проверьте функции даты и времени в MySQL.

    ответ дан codelogic, с репутацией 51493, 3.02.2009
  • 184 рейтинг
    GROUP BY DATE_FORMAT(record_date, '%Y%m')

    Примечание (прежде всего, для потенциальных понижателей). В настоящее время это может быть не так эффективно, как другие предложения. Тем не менее, я оставляю это как альтернативу, и еще одну, которая может помочь увидеть, насколько быстрее другие решения. (Поскольку вы не можете отличить быстрое от медленного до тех пор, пока не увидите разницу. Кроме того, со временем могут быть внесены изменения в движок MySQL в отношении оптимизации, чтобы сделать это решение в какой-то (возможно, не столь отдаленный) момент в будущем вполне сопоставимым по эффективности с большинством других.

    ответ дан Andriy M, с репутацией 62034, 23.04.2011
  • 38 рейтинг

    Я пытался использовать приведенное выше утверждение «ГДЕ», я считал его правильным, поскольку никто не исправил его, но я ошибся; после некоторых поисков я обнаружил, что это правильная формула для оператора WHERE, поэтому код выглядит так:

    SELECT COUNT(id)  
    FROM stats  
    WHERE YEAR(record_date) = 2009  
    GROUP BY MONTH(record_date)
    
    ответ дан dimazaid, с репутацией 1122, 23.04.2011
  • 36 рейтинг

    попробуйте это

    SELECT COUNT(id)
    FROM stats
    GROUP BY EXTRACT(YEAR_MONTH FROM record_date)
    

    ЭКСТРАКТ (единица ОТ даты) Функция лучше, так как используется меньшее группирование и функция возвращает числовое значение.

    Условие сравнения при группировке будет быстрее, чем функция DATE_FORMAT (которая возвращает строковое значение). Попробуйте использовать функцию | field, которая возвращает нестроковое значение для условия сравнения SQL (WHERE, HAVING, ORDER BY, GROUP BY).

    ответ дан fu-chi, с репутацией 361, 11.10.2011
  • 22 рейтинг

    Если ваш поиск более нескольких лет, и вы все еще хотите группировать ежемесячно, я предлагаю:

    , версия № 1:

    SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
    FROM stats
    GROUP BY DATE_FORMAT(record_date, '%Y%m')
    

    версия № 2 (более эффективный) :

    SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
    FROM stats
    GROUP BY YEAR(record_date)*100 + MONTH(record_date)
    

    Я сравнил эти версии в большой таблице с 1 357 918 строками ( ), и вторая версия, кажется, имеет лучшие результаты.

    version1 (в среднем 10 исполнений) : 1. 404 секунды
    version2 (в среднем 10 выполнений) : 0. 780 секунд

    (SQL_NO_CACHE ключ добавлен для предотвращения кэширования MySQL для запросов. )

    ответ дан mr.baby123, с репутацией 1416, 9.06.2013
  • 15 рейтинг

    Если вы хотите сгруппировать по дате в MySQL, используйте код ниже:

     SELECT COUNT(id)
     FROM stats
     GROUP BY DAYOFMONTH(record_date)
    

    Надеюсь, что это сэкономит время для тех, кто собирается найти эту тему.

    ответ дан Haijerome, с репутацией 1390, 10.10.2011
  • 10 рейтинг

    Если вы хотите отфильтровать записи за определенный год (например, г. 2000), затем оптимизируйте предложение WHERE следующим образом:

    SELECT MONTH(date_column), COUNT(*)
    FROM date_table
    WHERE date_column >= '2000-01-01' AND date_column < '2001-01-01'
    GROUP BY MONTH(date_column)
    -- average 0.016 sec.
    

    Вместо:

    WHERE YEAR(date_column) = 2000
    -- average 0.132 sec.
    

    Результаты были сгенерированы для таблицы, содержащей 300 тыс. Строк и столбец индекса по дате.

    Что касается предложения GROUP BY, я проверил три варианта по сравнению с вышеупомянутой таблицей; вот результаты:

    SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
    FROM date_table
    GROUP BY YEAR(date_column), MONTH(date_column)
    -- codelogic
    -- average 0.250 sec.
    
    SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
    FROM date_table
    GROUP BY DATE_FORMAT(date_column, '%Y%m')
    -- Andriy M
    -- average 0.468 sec.
    
    SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
    FROM date_table
    GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
    -- fu-chi
    -- average 0.203 sec.
    

    Последний является победителем.

    ответ дан Salman A, с репутацией 165526, 18.01.2014
  • 7 рейтинг

    Если вы хотите получать ежемесячную статистику с количеством строк за месяц каждого года, упорядоченного по последнему месяцу, попробуйте это:

    SELECT count(id),
          YEAR(record_date),
          MONTH(record_date) 
    FROM `table` 
    GROUP BY YEAR(record_date),
            MONTH(record_date) 
    ORDER BY YEAR(record_date) DESC,
            MONTH(record_date) DESC
    
    ответ дан user3019799, с репутацией 146, 22.11.2013
  • 6 рейтинг

    Полное и простое решение с аналогичной, но более короткой и гибкой альтернативой, в настоящее время активная:

    SELECT COUNT(*) FROM stats
    -- GROUP BY YEAR(record_date), MONTH(record_date), DAYOFMONTH(record_date)
    GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d')
    
    ответ дан Cees Timmerman, с репутацией 7759, 7.09.2017
  • 6 рейтинг

    Следующий запрос работал для меня в Oracle Database 12c Release 12. 1. 0. 1. 0

    SELECT COUNT(*)
    FROM stats
    GROUP BY 
    extract(MONTH FROM TIMESTAMP),
    extract(MONTH FROM TIMESTAMP),
    extract(YEAR  FROM TIMESTAMP);
    
    ответ дан Minisha, с репутацией 930, 22.05.2015
  • 5 рейтинг

    Вы можете сделать это просто Mysql DATE_FORMAT () функция в GROUP BY. Возможно, вы захотите добавить дополнительный столбец для большей ясности в некоторых случаях, например, когда записи охватывают несколько лет, а в разные годы - один и тот же месяц. Здесь так много вариантов, вы можете настроить это. Пожалуйста, прочитайте это перед началом. Надеюсь, это будет очень полезно для вас. Вот пример запроса для вашего понимания

    SELECT
        COUNT(id),
        DATE_FORMAT(record_date, '%Y-%m-%d') AS DAY,
        DATE_FORMAT(record_date, '%Y-%m') AS MONTH,
        DATE_FORMAT(record_date, '%Y') AS YEAR,
    
    FROM
        stats
    WHERE
        YEAR = 2009
    GROUP BY
        DATE_FORMAT(record_date, '%Y-%m-%d ');
    
    ответ дан Faisal, с репутацией 2516, 30.11.2016
  • 2 рейтинг

    Я предпочитаю оптимизировать выбор группы на один год следующим образом:

    SELECT COUNT(*)
      FROM stats
     WHERE record_date >= :year 
       AND record_date <  :year + INTERVAL 1 YEAR;
    

    Таким образом, вы можете просто связать год за один раз, e. г. '2009', с именованным параметром и не нужно беспокоиться о добавлении '-01-01' или передаче '2010' отдельно.

    Кроме того, поскольку предположительно мы просто считаем строки, а id никогда не равняется NULL, я предпочитаю COUNT(*) COUNT(id).

    ответ дан Arth, с репутацией 8469, 30.07.2014
  • -1 рейтинг

    .... group by to_char(date, 'YYYY') - & gt; 1989

    .... group by to_char(date,'MM') -> 05

    .... group by to_char(date,'DD') --- & gt; 23

    .... group by to_char(date,'MON') ---> май

    .... group by to_char(date,'YY') --- & gt; 89

    ответ дан aromita sen, с репутацией 17, 4.06.2016