Было бы проще, если бы у вас был столбец auto_increment, чтобы дать каждой строке свой собственный идентификатор - тогда вы могли бы присоединиться к таблице против себя в (alias2.id = alias1.id + 1) и вычислить diff из alias2.a-alias1 .а
На самом деле, я думаю, что единственный способ - использовать подзапрос, чтобы получить наибольшее значение меньше текущего значения строки, что будет очень неэффективно.
Так что, если можете, измените вашу схему!
create table somedata (
id int auto_increment not null,
a integer,
primary key(id)
);
insert into somedata (a) values (11), (25), (62);
select a2.a,ifnull(a2.a-a1.a, 0) as diff
from somedata as a1
right join somedata as a2 on (a2.id=a1.id+1);
+------+------+
| a | diff |
+------+------+
| 11 | 0 |
| 25 | 14 |
| 62 | 37 |
+------+------+
Используйте внутреннее объединение, а не правое, если вы не хотите, чтобы этот первый нулевой результат.
Редактировать: более подробное описание этой идеи см. В этой статье: Расчет различий между последовательными строками