mysql группировка по дням
Группа запросов MySQL по дням / месяцам / годам
возможно ли, что я сделаю простой запрос, чтобы подсчитать, сколько записей у меня есть в определенный период времени, например, год, месяц или день, имея
13 ответов
Примечание (в первую очередь, для потенциальных downvoters). В настоящее время это может оказаться не столь эффективным, как другие предложения. Тем не менее, я оставляю его в качестве альтернативы, которая также может помочь увидеть, насколько быстрее другие решения. (Ибо нельзя отличить быстрое от медленного, пока не увидишь разницу.) Кроме того, с течением времени могут быть внесены изменения в движок MySQL в отношении оптимизации, чтобы сделать это решение в некоторых (возможно, не так далеко) точка в будущем, чтобы стать вполне сопоставимыми по эффективности с большинством других.
Я попытался использовать оператор » где » выше, я думал, что это правильно, так как никто не исправил его, но я был неправ; после некоторых поисков я узнал, что это правильная формула для оператора WHERE, поэтому код становится таким:
извлечение (единица измерения от даты) функция лучше, поскольку используется меньше группировки, и функция возвращает числовое значение.
условие сравнения при группировании будет быстрее, чем функция DATE_FORMAT (которая возвращает строковое значение). Попробуйте использовать функцию / поле, которые возвращают нестроковое значение для условия сравнения SQL (где, имея, заказ по, Группа по).
Если ваш поиск более нескольких лет, и вы все еще хотите группировать ежемесячно, я предлагаю:
Версия № 1:
версия #2 (более эффективный):
Я сравнил эти версии на большой таблице с 1,357,918 строками (InnoDB в), и 2-я версия, похоже, имеет лучшие результаты.
version1 (в среднем выполняется 10): 1.404 секунд
version2 (в среднем выполняется 10): 0.780 секунд
( SQL_NO_CACHE ключ добавлен, чтобы предотвратить MySQL от кэширования запросов.)
Если вы хотите сгруппировать по дате в MySQL, используйте код ниже:
надеюсь, это сэкономит некоторое время для тех, кто собирается найти этот поток.
если вы хотите фильтровать записи за определенный год (например, 2000), оптимизируйте WHERE пункт такой:
результаты были сгенерированы для таблицы, содержащей 300k строк и столбец index on date.
Что касается GROUP BY предложение, я протестировал три варианта против вышеупомянутой таблицы; вот результаты:
последний является победителем.
Если вы хотите получить ежемесячную статистику с подсчетом строк в месяц каждого года, заказанного по последнему месяцу, попробуйте следующее:
полное и простое решение с аналогичным выполнением, но более короткой и гибкой альтернативой в настоящее время активен:
следующий запрос работал для меня в Oracle Database 12c Release 12.1.0.1.0
вы можете сделать это просто Mysql DATE_FORMAT () функция в группе BY. Может потребоваться добавить дополнительный столбец для большей ясности в некоторых случаях, например, когда записи охватывают несколько лет, а затем один и тот же месяц в разные годы.Здесь так много вариантов, которые вы можете настроить. Пожалуйста, прочитайте это для начала. Надеюсь, это будет очень полезно для вас. Вот пример запроса для вашего понимания
Я предпочитаю оптимизировать выбор группы на один год следующим образом:
Как сделать быструю группировку по дням и по часам в mysql?
Верно, просто индексы не помогут — любая операция над полем сразу блокирует использование индекса по нему. Добавлять ещё поля и там хранить данных в часах и днях (денормализация)
Кстати в СУБД побольше калибром есть возможность делать вычисляемые поля и делать по ним индексы, а также можно делать индексы по функции — что вам очень сильно помогло бы.
быстро можно только если сделать хранилище отдельное
дата | кол-во
и инкриментить с общим инсертом. (update order_counter set count=count+1 where date=date_format(date,’и какой типо групперовки вам нужен’), надо проверить что будет делать replace или insert с on dublicate key для самой первой встаки в идеале вместо update replace тогда и запись не надо будет проверять что есть.
либо опишите задачу подробнее, если в выборки еще фильтр какой-то есть,
то решение со счетчиком отдельным не поможет.
Попробуйте следующий вариант — 1. Это для группировки по дням
SELECT…
FROM…
GROUP BY UNIX_TIMESTAMP( поле с датой и временем ) DIV 24 * 3600
2. Это для группировки по часам
SELECT…
FROM…
GROUP BY UNIX_TIMESTAMP( поле с датой и временем ) DIV 3600
Если все еще будет тормозить (скорее всего так и будет), то эти два поля нужно добавлять к таблице и строить по ним индекс
Mysql группировка по дням месяца?
как я могу сгруппировать по дням, не имея значения в этот день
id date
1 01-02-16
2 05-02-16
а в результате получить
date count
01 1
02 0
03 0
04 0
05 1
Оценить 1 комментарий
ну не скажите, представим такую задачу есть GPS трекер, где у каждой компании есть свой пул автомобилей.
Так же у нас есть отчет содержащий подневно информацию о суммарном расходе топлива для всех машин компании.
Таблица отчета имеет такую структуру:
— идентификатор
— дата, тип date, вес 3 байта
— сумма, ну допустим возьмем float, вес 4 байта.
Если же мы недостающие даты будем проставлять в оболочке, без использования джойнов:
1. Мы можем доставить недостающие даты приблизительно за 34 итерации
2. В результате простой выборки из БД в оболочку будет доставлено всего 3 записи общим размером 21 байт, а не 217
Работаем с датами в MySQL
Обновлено: 19 декабря, 2018
Вычитание даты от текущей
Следующий код позволяет вычислить разницу в днях между текущей датой, и датой в поле date_start таблицы tbl_sites
Добавление текущей даты/времени при вставке записи
Для сохранения в таблице времени и даты добавления новой записи, необходимо создать новое поле таблицы в Time, где время будет храниться в Unix формате, либо поле TIMESTAMP, в котором время будет храниться в виде: “2013-09-17 15:00:00”.
Для первого случая (поле Time) для сохранения времени добавления записи используется функция time(). Код в данном случае будет выглядеть таким образом:
Для второго случая (поле TIMESTAMP) используется параметр CURRENT_TIMESTAMP (текущее время). Соответственно код будет таким:
Следует отметить, что при дальнейшей работе с этими полями, для вывода их значений в удобном виде, либо для подсчета разницы с каким либо значением времени, необходимо будет эти значения преобразовывать. Например, для того чтобы перевести значение TIMESTAMP в формат Unix-времени, необходимо воспользоваться процедурой strtotime(). Пример данного преобразования выглядит следующим образом (считаем количество секунд, прошедших с времени добавления записи в БД):
Группировка записей по дням, месяцам
Если необходимо, например, посчитать количество звонков по дням, или месяцам (в случаях когда одна запись – звонок), можно сделать следующим образом:
Считаем количество звонков по дням в период последние 30 дней:
Mysql группировка по дням
profit
id | user_id | date | profit
1 1 2009-06-01 100.55
2 1 2009-06-03 110.55
3 1 2009-06-04 120.55
4 1 2009-06-07 140.55
.
5 1 2009-06-12 130.55
6 1 2009-06-13 150.55
7 1 2009-06-14 105.55
������� �������!7 ��� 09, 16:33����[7512098] �������� | ���������� �������� ����������
| |
progi2007 Member 2009-08-08 150.0000 2009-06-01 �� 2009-06-05 | 10509.7444 ��� ��� �� ��� | |
7 ��� 09, 16:56����[7512260] �������� | ���������� �������� ���������� |
| |
tanglir Member Group By Week(mytable.date), ���? | |
7 ��� 09, 17:54����[7512608] �������� | ���������� �������� ���������� |
| |||
progi2007 Member ������: |
DAYOFWEEK(d_date) startInt endInt SUM(profit) DAYOFWEEK(d_date) startInt endInt SUM(profit) ����� � �����, � ���� ���� 4 ������ ��������, �� ������� �� ����� ����� ��� ����. | ||
7 ��� 09, 18:16����[7512715] �������� | ���������� �������� ���������� |
| |||
tanglir Member ������: |
|