我如何滞后MySQL的列?

考虑下表:

SELECT id, value FROM table ORDER BY id ASC; +-----+---------+ | id | value | +-----+---------+ | 12 | 158 | | 15 | 346 | | 27 | 334 | | 84 | 378 | | 85 | 546 | +-----+---------+ 

id列是自动递增的,但包含间隙。 value列是数字。

我想通过设置与上面两行的value有关的value来看看随着时间的推移value的增加。 这是为行id=85我想设置行id=85 (546)的value对于行id=27 (334)的值。 行id=85计算值是546/334 = 1.63473。

这是我想要达到的结果:

 SELECT id, value, ...; +-----+---------+---------------------+ | id | value | value/lag(value, 2) | (the syntax value/lag(value, 2) is made up) +-----+---------+---------------------+ | 12 | 158 | NULL | | 15 | 346 | NULL | | 27 | 334 | 2.11392 | (334/158=2.11392) | 84 | 378 | 1.09248 | (378/346=1.09248) | 85 | 546 | 1.63473 | (546/334=1.63473) +-----+---------+---------------------+ 

我如何在MySQL中执行这样的延迟?

请注意, id列包含间隙,所以只需在t1.id = t2.id - 2的同一张表上进行t1.id = t2.id - 2

这是一个解决scheme,返回你想要在MySQL中

 SET @a :=0; SET @b :=2; SELECT r.id, r.value, r.value/r2.value AS 'lag' FROM (SELECT if(@a, @a:=@a+1, @a:=1) as rownum, id, value FROM results) AS r LEFT JOIN (SELECT if(@b, @b:=@b+1, @b:=1) as rownum, id, value FROM results) AS r2 ON r.rownum = r2.rownum 

MySQL 5.1并不喜欢自动连接的子查询,所以你必须对行进行两次计数,所以不要像整理或者可伸缩一样,但是它确实使得指定滞后简单。

对于使用Oracle的读者来说,这是非常容易的

 SELECT id, value, value/lag(value, 2) over (order by id) as lag from results; 

由于目前的数据只有两行,而你想获取“历史数据”的数据只有两行,所以你可以使用variables临时存储数据,例如:

set @oldid0=999999;
set @oldid1=999999;
set @oldid2=999999;
select @oldid0:=@oldid1,@oldid1:=@oldid2,@oldid2:=id, value/@oldid0 from table order by id asc;

这是一个非常不整洁的解决scheme,但我认为它会完成这项工作。 也许有一些方法可以防止显示variables,我还没有看到这一点。