Ответ 1
Предполагая, что у вас есть столбец заказа - скажем id
- тогда вы можете сделать следующее в SQL Server 2012:
select col,
col - coalesce(lag(col) over (order by id), 0) as diff
from t;
В более ранних версиях SQL Server вы можете сделать почти то же самое, используя коррелированный подзапрос:
select col,
col - isnull((select top 1 col
from t t2
where t2.id < t.id
order by id desc
), 0)
from t
Это использует isnull()
вместо coalesce()
из-за "ошибки" в SQL Server, которая дважды оценивает первый аргумент при использовании coalesce()
.
Вы также можете сделать это с помощью row_number()
:
with cte as (
select col, row_number() over (order by id) as seqnum
from t
)
select t.col, t.col - coalesce(tprev.col, 0) as diff
from cte t left outer join
cte tprev
on t.seqnum = tprev.seqnum + 1;
Все это предполагает, что у вас есть столбец для указания порядка. Это может быть id
, дата создания или что-то еще. SQL-таблицы по сути неупорядочены, поэтому нет такой вещи, как "предыдущая строка" без столбца, определяющего порядок.