SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.06.2009 14:13:44

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Как организовать запрос с частичной группировкой

Добрый день.

Помогите в составлении запроса (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

но этого мало (, дальше придумать не получается.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 25.06.2009 16:18:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Как организовать запрос с частичной группировкой

Вообще, лучше использовать курсор. Есть вот такой вариант двумя запросами:

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;
+-------+
| @c:=0 |
+-------+
|     0 |
+-------+
1 row in set (0,00 sec)

+---------------------+---------+
| starttime           | my_data |
+---------------------+---------+
| 2009-01-01 00:04:00 |      25 |
| 2009-01-01 00:09:00 |      20 |
+---------------------+---------+
2 rows in set (0,00 sec)

Неактивен

 

#3 26.06.2009 09:50:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Как организовать запрос с частичной группировкой

Спасибо большое, Paulus.

Не подскажете ли какую ссылку, где на русском можно было бы почитать про работу c такими курсорами (с примерами)? А то все, что я находил оказалось несколько не то (.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 26.06.2009 14:24:15

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Как организовать запрос с частичной группировкой

На русском, боюсь, не подскажу. С другой стороны, в документации куча очевидных примеров.
http://dev.mysql.com/doc/refman/5.1/en/cursors.html

Неактивен

 

#5 26.06.2009 16:18:32

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Как организовать запрос с частичной группировкой

Спасибо еще раз! Тему, видимо, можно закрыть


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 29.06.2009 07:30:25

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Как организовать запрос с частичной группировкой

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

, просто выстраивая рядом с нужными данными вспомогательную колонку.  Вроде результат такой же. Просто я еще про курсоры, почитал, что медленная штука, как лучше делать?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 29.06.2009 11:09:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Как организовать запрос с частичной группировкой

Да, как вариант. Выбирайте то, что Вам больше нравится smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson