处理数据的时候,往往需要回溯历史,比如给用户分群后计算每个群体的用户数趋势,那么就需要计算截止到每一天的各个群体的用户数量,这个时候我们就需要创建存储过程,并且在存储过程中增加循环的功能,以此来实现上述回溯的需求。
第一步:先创建一个初始表,用于循环过程中插入数据
-- 创建表之前先判断有没有这个表存在,有的话就删掉
DROP TABLE IF EXISTS test_table;-- 创建表
CREATE TABLE `test_table` (`id` INT (11) NOT NULL AUTO_INCREMENT,`time` VARCHAR (255) DEFAULT '2021-12-22 11:22:32',PRIMARY KEY (`id`),UNIQUE KEY `time` (`time`)
) ENGINE = INNODB AUTO_INCREMENT = 11 DEFAULT CHARSET = utf8;-- 创建完先看一眼这个表
desc test_table;
第二步:创建存储过程
-- 定义结束符为 $$
delimiter $$-- 创建存储过程之前先判断有没有这个存储过程存在,有的话就删掉,防止报错
drop procedure if exists insertdata;
create procedure insertdata( a INT) -- 创建新的存储过程,a是参数,整数begindeclare i int default 0; -- 变量声明i while i < a do -- 判断条件,满足条件则执行下面的循环,不满足条件则跳过,结束循环-- 插入数据set @t = DATE_ADD(DATE('2021-12-20'), INTERVAL - i DAY); -- 从'2021-12-20'往前回溯a天INSERT INTO test_table (`id`,`time`) VALUE (i , @t) ; set i = i + 1; -- 每执行一次循环之后 i +1 end while; -- 结束循环end $$ -- 结束存储过程
第三步:调用循环过程
-- 调用存储过程
call insertdata(10); -- 设置a为10,也就是从固定日期往前回溯10天的数据-- 查看存储过程执行之后的数据
select * from test_table;
番外:有时候会出现报错Commands out of sync; you can't run this command now
这个报错和循环过程没有关系,这个窗口失效了,重新打开一个窗口再查询就正常了