Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почасовая статистика SELECT, групировка по часам 
:(
    Опции темы
Veve
Дата 12.2.2007, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: 3
Всего: 13



Здр... 
Есть таблича:
----------------------------------------------------------------
| дата  смерти               | Убитый таракан
-----------------------------------------------------------------
.................................................................................
| 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 
PM MAIL ICQ Skype MSN   Вверх
muzer
Дата 12.2.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Код

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;

PM WWW   Вверх
skyboy
Дата 12.2.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(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)

PM MAIL   Вверх
Veve
Дата 12.2.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: 3
Всего: 13



Не совсем!!!! 
Не хватает нулевых тараканчиков. Мне нужен отчёт за каждый час даже когда тараканчиков не убивали!

с 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]
PM MAIL ICQ Skype MSN   Вверх
skyboy
Дата 12.2.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



а хранимые процедуры СУБД поддерживаются? может, есть таблица, в которой зачем - то хранятся записи о каждом часе, для которого надо произвести рассчет? ведь СУБД не имеет понятия о "каждом часе"... или статистика - только за последние сутки приводится?
PM MAIL   Вверх
muzer
Дата 12.2.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Ой, извиняйте. Не внимателен был.

В 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 тысяч строк, а дальше в подзапросе обычным лимитом ограничиваем кол-во часов, на которое нам нужно оторваться от стартовой даты.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.