【mysql】使用变量实现类似oracle中lag函数功能

mysql使用变量实现类似oracle中的lag函数功能

说明:
有一个订单表,每次下单都会记录是否使用了券,现模拟一个需求,将订单表插入日志表达到记录用户上一次是否用券以及此订单是否用券的情况

#--------实现:
#创建表t_order

create table t_order(id int,name varchar(50),time date);

#插入数据
 

insert into t_order values(1001,'用券','2019-04-01');
insert into t_order values(1002,'不用券','2019-05-10');
insert into t_order values(1001,'不用券','2019-05-01');
insert into t_order values(1003,'不用券','2019-04-12');
insert into t_order values(1001,'不用券','2019-05-11');
insert into t_order values(1002,'用券','2019-05-30');
insert into t_order values(1001,'不用券','2019-05-22');
insert into t_order values(1003,'用券','2019-05-24');

查看原数据

select * from t_order;
id      name        time
1001    用券       2019-04-01
1002    不用券     2019-05-10
1001    不用券     2019-05-01
1003    不用券     2019-04-12
1001    不用券     2019-05-11
1002    用券       2019-05-30
1001    不用券     2019-05-22
1003    用券       2019-05-24

#语句

SELECT base.id
      ,base.before_name
      ,base.name
      ,base.time
  FROM (SELECT IF(@id = t.id, @lagname := @NAME, @lagname := '') AS before_name
              ,@id := t.id AS tid
              ,@NAME := t.name AS tafter_name
              ,t.*
          FROM (SELECT *
                  FROM t_order
                 ORDER BY id
                         ,TIME) t
              ,(SELECT @lagname := NULL
                      ,@id      := 0
                      ,@NAME    := NULL) r) base;

id    before_name   name        time
1001                 用券      2019-04-01
1001    用券         不用券    2019-05-01
1001    不用券       不用券    2019-05-11
1001    不用券       不用券    2019-05-22
1002                 不用券    2019-05-10
1002    不用券       用券      2019-05-30
1003                 不用券    2019-04-12
1003    不用券       用券      2019-05-24

注意:

1、order by排序很重要,它将决定取到的值是否正确;

 

 


版权声明:本文为debimeng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。