Это больно, но вы можете сделать:
select t.*,
(select top 1 t2.sub1
from t as t2
where t2.name = t.name and t2.id < t.id
order by t2.id desc
) as prev_sub1
from t;
Это дает предыдущее значение или NULL
для первого ряда.Вы можете просто использовать -
для вычитания.
Индекс на (name, id)
немного поможет с производительностью.Однако, если вы можете перейти на более качественную базу данных, вы можете просто использовать lag()
.