Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Помогите в составлении запроса (mysql 5) плиз.
Имеется таблица
CREATE TABLE `t` (
`starttime` datetime default NULL,
`finishtime` datetime default NULL,
`my_data` bigint(20) unsigned default NUL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
в ней данные
insert into t(starttime,finishtime,my_data) values('2009-01-01 00:00:00','2009-01-01 00:00:59',6);
insert into t(starttime,finishtime,my_data) values('2009-01-01 00:01:00','2009-01-01 00:01:59',5);
insert into t(starttime,finishtime,my_data) values('2009-01-01 00:02:00','2009-01-01 00:02:59',4);
insert into t(starttime,finishtime,my_data) values('2009-01-01 00:03:00','2009-01-01 00:03:59',3);
insert into t(starttime,finishtime,my_data) values('2009-01-01 00:04:00','2009-01-01 00:04:59',7);
insert into t(starttime,finishtime,my_data) values('2009-01-01 00:05:00','2009-01-01 00:05:59',5);
insert into t(starttime,finishtime,my_data) values('2009-01-01 00:06:00','2009-01-01 00:06:59',4);
insert into t(starttime,finishtime,my_data) values('2009-01-01 00:07:00','2009-01-01 00:07:59',3);
insert into t(starttime,finishtime,my_data) values('2009-01-01 00:08:00','2009-01-01 00:08:59',2);
insert into t(starttime,finishtime,my_data) values('2009-01-01 00:09:00','2009-01-01 00:09:59',6);
таким образом в таблице:
starttime finishtime my_data
'2009-01-01 00:00:00' '2009-01-01 00:00:59' 6
'2009-01-01 00:01:00' '2009-01-01 00:01:59' 5
'2009-01-01 00:02:00' '2009-01-01 00:02:59' 4
'2009-01-01 00:03:00' '2009-01-01 00:03:59' 3
'2009-01-01 00:04:00' '2009-01-01 00:04:59' 7
'2009-01-01 00:05:00' '2009-01-01 00:05:59' 5
'2009-01-01 00:06:00' '2009-01-01 00:06:59' 4
'2009-01-01 00:07:00' '2009-01-01 00:07:59' 3
'2009-01-01 00:08:00' '2009-01-01 00:08:59' 2
'2009-01-01 00:09:00' '2009-01-01 00:09:59' 6
( на самом деле данных гораздо больше, я для примера привел только 10 записей)
Нужно посчитать сумму my_data в пятиминутных интервалах, чтоьы получить нечто в роде
25
20
Хотелось бы одним запросом, а не путем
SELECT sum(my_data) FROM t where starttime>='2009-01-01 00:00:00' and finishtime<='2009-01-01 00:04:59';
и
SELECT sum(my_data) FROM t where starttime>='2009-01-01 00:05:00' and finishtime<='2009-01-01 00:09:59';
Пытался сделать путем группировки по starttime с условием
where UNIX_TIMESTAMP(starttime)%300==0, но так просто выкидываются все кроме
'2009-01-01 00:00:00' '2009-01-01 00:00:59' 6
и
'2009-01-01 00:05:00' '2009-01-01 00:05:59' 5
но этого мало (, дальше придумать не получается.
Неактивен
Вообще, лучше использовать курсор. Есть вот такой вариант двумя запросами:
Неактивен
Спасибо большое, Paulus.
Не подскажете ли какую ссылку, где на русском можно было бы почитать про работу c такими курсорами (с примерами)? А то все, что я находил оказалось несколько не то (.
Неактивен
На русском, боюсь, не подскажу. С другой стороны, в документации куча очевидных примеров.
http://dev.mysql.com/doc/refman/5.1/en/cursors.html
Неактивен
Спасибо еще раз! Тему, видимо, можно закрыть
Неактивен
paulus написал:
Вообще, лучше использовать курсор. Есть вот такой вариант двумя запросами:
mysql> select @c:=0; select starttime, my_data from (select starttime, if(unix_timestamp(starttime) % 300, @c := @c+my_data, @c := my_data) as my_data, if((unix_timestamp(starttime) + 60) % 300, 1, 0) as mark from t) tt where mark = 0;
2 rows in set (0,00 sec)
В принципе можно еще ведь вот так?:
SELECT starttime,starttime-interval(UNIX_TIMESTAMP(starttime)%300) second as s5,sum(my_data) as my_data FROM t group by s5 order by starttime asc
, просто выстраивая рядом с нужными данными вспомогательную колонку. Вроде результат такой же. Просто я еще про курсоры, почитал, что медленная штука, как лучше делать?
Неактивен
Да, как вариант. Выбирайте то, что Вам больше нравится
Неактивен