Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Почасовая статистика SELECT


Автор: Veve 12.2.2007, 19:06
Здр... 
Есть таблича:
----------------------------------------------------------------
| дата  смерти               | Убитый таракан
-----------------------------------------------------------------
.................................................................................
| 2009-01-09 13:01:59  | Жорик
-----------------------------------------------------------------
| 2009-01-09 13:02:59  | Зюзя
------------------------------------------------------------------
| 2009-01-09 16:00:01  | Ефросий
..................................................................................
__________________________________________
Подскажите пожалуста как создать следующий запрос:
Запрос должен работать в промежутке времени, ну к примеру так: dead_time BETWEEN '2009-01-09 13:00:00' AND '2009-01-09 17:00:00') и групировать количество убитых тараканчиков по часам...
Ну типо того:
с 2009-01-09 13:00:00 до  14:00:00 убито 2 тараканчика
с 2009-01-09 14:00:00 до  15:00:00 убито 0 тараканчиков
с 2009-01-09 15:00:00 до  16:00:00 убито 0 тараканчиков
с 2009-01-09 16:00:00 до  17:00:00 убито 1 тараканчик

Ну я думаю... что что-то в такой степи должно быть ну только чё-то не хватает...
SELECT  count(*) 
FROM tarakan
WHERE (dead_time BETWEEN '2009-01-09 13:00:00' AND '2009-01-09 17:00:00') 
GROUP BY hour(dead_time);

зарание спасибо!  smile 

Автор: muzer 12.2.2007, 19:20
Код

SELECT LEFT(dead_time+0, 10) AS Hour,COUNT(*) FROM tarakan WHERE dead_time BETWEEN 20090109130000 AND 20090109170000 GROUP BY Hour;
Ну либо ваш вариант:
Код

SELECT  hour(dead_time) AS h,count(*) 
FROM tarakan
WHERE dead_time BETWEEN '2009-01-09 13:00:00' AND '2009-01-09 17:00:00'
GROUP BY h;

Автор: skyboy 12.2.2007, 19:21
Цитата(Veve @  12.2.2007,  18:06 Найти цитируемый пост)
что что-то в такой степи должно быть ну только чё-то не хватает...

только указания времени, по-моему, и не хватает smile
Код

SELECT  count(*),DATE_SUB(last_dt,interval concat(minute(last_dt),':',second(last_dt)) MINUTE_SECOND)
FROM tarakan
WHERE (dead_time BETWEEN '2009-01-09 13:00:00' AND '2009-01-09 17:00:00') 
GROUP BY hour(dead_time)

Автор: Veve 12.2.2007, 19:31
Не совсем!!!! 
Не хватает нулевых тараканчиков. Мне нужен отчёт за каждый час даже когда тараканчиков не убивали!

с 2009-01-09 13:00:00 до  14:00:00 убито 2 тараканчика
с 2009-01-09 14:00:00 до  15:00:00 убито 0 тараканчиков
с 2009-01-09 15:00:00 до  16:00:00 убито 0 тараканчиков

с 2009-01-09 16:00:00 до  17:00:00 убито 1 тараканчик[/B]

Автор: skyboy 12.2.2007, 19:47
а хранимые процедуры СУБД поддерживаются? может, есть таблица, в которой зачем - то хранятся записи о каждом часе, для которого надо произвести рассчет? ведь СУБД не имеет понятия о "каждом часе"... или статистика - только за последние сутки приводится?

Автор: muzer 12.2.2007, 19:51
Ой, извиняйте. Не внимателен был.

В Oracle можно было бы с dual придумать.
А здесь приходит на ум мысль создать таблицу с 24 часами, по ней генерить необходиые времена, и джойнить это дело через LEFT JOIN с таблицей данных.

Например, таблица с часами Hours, одно поле value (24 строки, от 0 до 23)

Код

SELECT
HTime,
COUNT(T.tarakan_name) 
FROM
(SELECT 20090109130000 + INTERVAL value HOUR AS HTime FROM Hours) tmp
LEFT JOIN tarakan T ON T.dead_time BETWEEN tmp.HTime AND tmp.HTime + INTERVAL 59 MINUTE
GROUP BY HTime


Добавлено @ 19:52 
Соответсвенно в примере не ограничивал по времени, сами сделаете думаю smile
Ну и можно ещё покумекать, как уйти от ограниченности 24мя часами.

Добавлено @ 19:57 
И снова я smile

Подумал, что вы вряд ли совсем уж маньяк, и запаса в 10 тысяч часов вам хватит, поэтому делаем Hours из 10 тысяч строк, а дальше в подзапросе обычным лимитом ограничиваем кол-во часов, на которое нам нужно оторваться от стартовой даты.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)