How do I lag columns in MySQL?

前端 未结 2 1535
野趣味
野趣味 2020-11-28 14:01

Consider the following table:

SELECT id, value FROM table ORDER BY id ASC;
+-----+---------+
| id  | value   |
+-----+---------+
| 12  | 158     |
| 15  | 34         


        
相关标签:
2条回答
  • 2020-11-28 14:19

    As there are only two rows between the current one and the one from where you want to get the 'historical' data could you perphaps use variables to store the data temporarily using something like:

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

    It is a very untidy solution but I think it will do the job. Maybe there is some way of preventing the variables from being displayed, I've not looked into it that far.

    0 讨论(0)
  • 2020-11-28 14:21

    Here is a solution that returns what you want in 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 doesn't like a self join against a subquery so you have to count rows twice, so not as tidy or scalable as it might be, but it does make specifying the lag simple.

    For readers that use Oracle instead this is much easier

    SELECT id, value, value/lag(value, 2) over (order by id) as lag from results;
    
    0 讨论(0)
提交回复
热议问题