Группировка запросов MySql по времени

Я пытаюсь создать отчет, чтобы понять время суток, когда размещаются заказы, поэтому мне нужно суммировать и сгруппировать их по времени. Например, я хотел бы получить сумму всех заказов, размещенных между 1 и 1:59, затем в следующей строке перечислить сумму всех заказов между 2:00 и 2:59 и т. д. Поле представляет собой переменную даты и времени, но для life me Я не смог найти правильный запрос для этого. Буду очень признателен за любые предложения, отправляющие меня по правильному пути.

Спасибо


person jimmyb    schedule 28.03.2011    source источник
comment
mysql/sqlite/оракул/postgresql/sql-сервер?   -  person RichardTheKiwi    schedule 29.03.2011


Ответы (2)


Если повезет, это mysql и под суммой заказов вы имеете в виду количество заказов, а не сумму стоимости:

select date_format(date_field, '%Y-%m-%d %H') as the_hour, count(*)
from my_table
group by the_hour
order by the_hour
person Clodoaldo Neto    schedule 28.03.2011
comment
Обязательно приближаемся. Вы правы, mysql и количество заказов. У меня в таблице около 1600 строк, но, похоже, она считается по дням, а не по всем датам. Вот частичный результат запроса: 2010-06-17 12:00:00 1 2010-07-28 22:00:00 1 2010-07-29 00:00:00 1 2010-07-29 07:00:00 1 2010-07-29 11:00:00 1 2010-07-29 20:00:00 2 2010-07-29 21:00:00 1 2010-07-30 09:00:00 1 2010-07-30 10:00:00 2 2010-07-30 11:00:00 1 2010-07-30 12:00:00 1 2010-07-30 15:00:00 1 2010-07-30 18:00:00 1 2010-07-30 19:00:00 1 2010-07-30 20:00:00 1 2010-07-30 21:00:00 1 2010-07-31 02:00:00 1 2010-0 - person jimmyb; 29.03.2011
comment
Да, запрос был против всех 1600 строк. Я должен был быть более четким, запрос дал результат 1100 сотен строк (этот форум позволил мне скопировать только 20 или около того строк), но он разбивается на дату: час, а не подсчитывает заказы за каждый час во все дни (для всего 24 ряда). Например, 29 июля 2010 года (см. выше) было 6 заказов, 1 в полночь, 1 в 11 утра, 2 в 8 вечера и т. д. Я просто не знаю, как объединить все дни и разбить результат по часам. Вот мой запрос: ВЫБЕРИТЕ STR_TO_DATE(DATETIME, '%Y-%m-%d %H') AS the_hour, COUNT(*) FROM Orders GROUP BY the_hour ORDER BY the_hour - person jimmyb; 29.03.2011
comment
Так очень, очень близко. ;) Как только я присмотрелся и понял, как вы пытались это сделать, я понял, что нам нужен только компонент часа, а не вся дата. Успех! Итак, окончательный результат: SELECT DATE_FORMAT( DATETIME, '%H' ) AS the_hour, COUNT( * ) FROM orders GROUP BY the_hour ORDER BY the_hour Спасибо за помощь! - person jimmyb; 29.03.2011

Этот король группировки (с использованием вычисляемого поля) определенно не будет масштабироваться со временем. Если вам действительно нужно часто выполнять эту конкретную GROUP BY/ORDER BY, вам следует создать дополнительное поле (достаточно поля UNSIGNED TINYINT), в котором будет храниться час, и поместить ИНДЕКС в этот столбец.

Это, конечно, если ваша таблица становится довольно большой, если она маленькая (что не может быть указано в простом количестве записей, потому что на самом деле это также вопрос конфигурации и возможностей сервера), вы, вероятно, не заметите большой разницы в производительности. .

person georgepsarakis    schedule 04.09.2011