Consider the following table:
SELECT id, value FROM table ORDER BY id ASC;
+-----+---------+
| id | value |
+-----+---------+
| 12 | 158 |
| 15 | 34
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.
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;