56,678
社区成员
发帖
与我相关
我的任务
分享
mysql> delimiter //
mysql>
mysql> CREATE PROCEDURE simpleproc (itvl INT)
-> BEGIN
-> DECLARE a,a1 CHAR default '';
-> DECLARE b,b1 Datetime default '1900-01-01 00:00:00';
-> DECLARE c INT DEFAULT 0;
->
-> DECLARE done INT DEFAULT 0;
-> DECLARE cur1 CURSOR FOR SELECT ColA,ColB FROM tx order by ColA,ColB;
-> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
->
->
-> OPEN cur1;
->
-> delete from ty;
->
-> REPEAT
-> FETCH cur1 INTO a, b;
-> IF a != a1 or TIMEDIFF(b,b1)>itvl*100 THEN
-> insert into ty values (a,b);
-> set a1 = a;
-> set b1 = b;
-> set c = 0;
-> ELSE
-> if a='A' and c=0 then
-> insert into ty values (a,b);
-> set c = 1;
-> end if;
-> END IF;
->
-> UNTIL done END REPEAT;
->
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> delimiter ;
mysql> select * from tx;
+------+---------------------+
| ColA | ColB |
+------+---------------------+
| B | 2009-06-15 10:58:23 |
| B | 2009-06-15 10:59:23 |
| B | 2009-06-15 11:00:23 |
| B | 2009-06-15 11:01:24 |
| B | 2009-06-15 11:02:23 |
| B | 2009-06-15 11:03:23 |
| B | 2009-06-15 11:04:25 |
+------+---------------------+
7 rows in set (0.00 sec)
mysql> call simpleproc(3);
Query OK, 1 row affected (0.14 sec)
mysql> select * from ty;
+------+---------------------+
| ColA | ColB |
+------+---------------------+
| B | 2009-06-15 10:58:23 |
| B | 2009-06-15 11:01:24 |
| B | 2009-06-15 11:04:25 |
+------+---------------------+
3 rows in set (0.00 sec)
mysql>
create database testdb;
use testdb;
create table testtable (cola varchar(2),colb datetime);
create index a on testtable(cola,colb);
insert into testtable values
('A','2009-06-15 10:58:23'),
('B','2009-06-15 10:58:31'),
('C','2009-06-15 10:53:36'),
('C','2009-06-15 10:54:36'),
('C','2009-06-15 10:55:36'),
('C','2009-06-15 10:56:36'),
('C','2009-06-15 10:57:36'),
('C','2009-06-15 10:58:36'),
('C','2009-06-15 10:59:36'),
('A','2009-06-15 10:58:39'),
('A','2009-06-15 10:59:23'),
('B','2009-06-15 11:00:22'),
('B','2009-06-15 10:55:31'),
('B','2009-06-15 10:59:31'),
('B','2009-06-15 11:03:31'),
('B','2009-06-15 11:04:31'),
('A','2009-06-15 11:04:25'),
('A','2009-06-15 11:05:25'),
('A','2009-06-15 11:06:25');
select * from testtable;#显示一下样本数据
set @t=DATE('1900-01-01 00:00:00');#设置一个比表中任何一个时间都小的日期
set @a="";
set @Anum=0;
#以下是记录合并查询语句
select cola,colb,(@Anum:=if(DATE_SUB(colb,INTERVAL 3 MINUTE)<=@t && cola='A',@Anum+1,0)) as
Anum,(@isa:=if(cola='A' && @Anum<2,true,false)) as isa,(@t:=if(DATE_SUB(colb,INTERVAL 3
MINUTE)>=@t || cola!=@a || @isa,colb,@t)) as mergetime,(@a:=cola) from testtable group by cola,mergetime;
drop table testtable;
drop database testdb;
mysql> select * from tx;
+------+---------------------+
| ColA | ColB |
+------+---------------------+
| A | 2009-06-15 10:58:23 |
| B | 2009-06-15 10:58:31 |
| C | 2009-06-15 10:58:36 |
| A | 2009-06-15 10:58:39 |
| A | 2009-06-15 10:59:23 |
| B | 2009-06-15 11:00:22 |
| A | 2009-06-15 11:00:25 |
+------+---------------------+
7 rows in set (0.00 sec)
mysql>
mysql> delimiter //
mysql>
mysql> CREATE PROCEDURE simpleproc (itvl INT)
-> BEGIN
-> DECLARE a,a1 CHAR default '';
-> DECLARE b,b1 Datetime default '1900-01-01 00:00:00';
-> DECLARE c INT DEFAULT 0;
->
-> DECLARE done INT DEFAULT 0;
-> DECLARE cur1 CURSOR FOR SELECT ColA,ColB FROM tx order by ColA,ColB;
-> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
->
->
-> OPEN cur1;
->
-> delete from ty;
->
-> REPEAT
-> FETCH cur1 INTO a, b;
-> IF a != a1 or MINUTE(TIMEDIFF(b,b1))>itvl THEN
-> insert into ty values (a,b);
-> set a1 = a;
-> set b1 = b;
-> set c = 0;
-> ELSE
-> if a='A' and c=0 then
-> insert into ty values (a,b);
-> set c = 1;
-> end if;
-> END IF;
->
-> UNTIL done END REPEAT;
->
-> END;
-> //
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> delimiter ;
mysql>
mysql> CALL simpleproc(3);
Query OK, 1 row affected (0.13 sec)
mysql> select * from ty;
+------+---------------------+
| ColA | ColB |
+------+---------------------+
| A | 2009-06-15 10:58:23 |
| A | 2009-06-15 10:58:39 |
| B | 2009-06-15 10:58:31 |
| C | 2009-06-15 10:58:36 |
+------+---------------------+
4 rows in set (0.00 sec)
mysql>
create database testdb;
use testdb;
create table testtable (cola varchar(2),colb datetime);
create index a on testtable(cola,colb);
insert into testtable values
('A','2009-06-15 10:58:23'),
('B','2009-06-15 10:58:31'),
('C','2009-06-15 10:53:36'),
('C','2009-06-15 10:54:36'),
('C','2009-06-15 10:55:36'),
('C','2009-06-15 10:56:36'),
('C','2009-06-15 10:57:36'),
('C','2009-06-15 10:58:36'),
('C','2009-06-15 10:59:36'),
('A','2009-06-15 10:58:39'),
('A','2009-06-15 10:59:23'),
('B','2009-06-15 11:00:22'),
('B','2009-06-15 10:55:31'),
('B','2009-06-15 10:59:31'),
('B','2009-06-15 11:03:31'),
('B','2009-06-15 11:04:31'),
('A','2009-06-15 11:04:25'),
('A','2009-06-15 11:05:25'),
('A','2009-06-15 11:06:25');
select * from testtable;#显示一下样本数据
set @t=DATE('1900-01-01 00:00:00');#设置一个比表中任何一个时间都小的日期
set @a="";
#以下是记录合并查询语句
select cola,colb,(@t:=if(DATE_SUB(colb,INTERVAL 3 MINUTE)>=@t || cola!=@a,colb,@t)) as
mergetime,(@a:=cola) from testtable group by cola,mergetime;
mysql> delimiter //
mysql>
mysql> CREATE PROCEDURE simpleproc (itvl INT)
-> BEGIN
-> DECLARE a,a1,ao CHAR default '';
-> DECLARE b,b1 Datetime default '1900-01-01 00:00:00';
-> DECLARE c INT DEFAULT 0;
->
-> declare sAList varchar(1000);
->
-> DECLARE done INT DEFAULT 0;
-> DECLARE cur1 CURSOR FOR
-> SELECT tx.ColA,tx.ColB,othertable.cloa
-> FROM tx left join othertable on tx.ColA=othertable.cloa
-> order by ColA,ColB;
-> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
->
-> OPEN cur1;
->
-> delete from ty;
->
-> REPEAT
-> FETCH cur1 INTO a, b, ao;
-> IF a != a1 or TIMEDIFF(b,b1)>itvl*100 THEN
-> insert into ty values (a,b);
-> set a1 = a;
-> set b1 = b;
-> set c = 0;
-> ELSE
-> if ao is not null and c=0 then -- changed
-> insert into ty values (a,b);
-> set c = 1;
-> end if;
-> END IF;
->
-> UNTIL done END REPEAT;
->
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> delimiter ;
mysql>
mysql> delimiter //
mysql>
mysql> CREATE PROCEDURE simpleproc (itvl INT)
-> BEGIN
-> DECLARE a,a1 CHAR default '';
-> DECLARE b,b1 Datetime default '1900-01-01 00:00:00';
-> DECLARE c INT DEFAULT 0;
->
-> declare sAList varchar(1000);
->
-> DECLARE done INT DEFAULT 0;
-> DECLARE cur1 CURSOR FOR SELECT ColA,ColB FROM tx order by ColA,ColB;
-> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
->
-> select group_concat(cloa) into sAList from othertable; -- changed
->
-> OPEN cur1;
->
-> delete from ty;
->
-> REPEAT
-> FETCH cur1 INTO a, b;
-> IF a != a1 or TIMEDIFF(b,b1)>itvl*100 THEN
-> insert into ty values (a,b);
-> set a1 = a;
-> set b1 = b;
-> set c = 0;
-> ELSE
-> if FIND_IN_SET(a,sAList) and c=0 then -- changed
-> insert into ty values (a,b);
-> set c = 1;
-> end if;
-> END IF;
->
-> UNTIL done END REPEAT;
->
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> delimiter ;
mysql>