Zakładając masz kolumnę zamówień - mówią id
- wtedy można wykonać następujące czynności w SQL Server 2012:
select col,
col - coalesce(lag(col) over (order by id), 0) as diff
from t;
we wcześniejszych wersjach SQL Server, można zrobić prawie to samo za pomocą podzapytanie skorelowane:
select col,
col - isnull((select top 1 col
from t t2
where t2.id < t.id
order by id desc
), 0)
from t
używa isnull()
zamiast coalesce()
powodu „bug” w SQL Server, który ocenia pierwszy argument dwukrotnie podczas korzystania coalesce()
.
Można również zrobić to z 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;
Wszystkie te zakładają, że masz jakąś kolumnę określającą kolejność. Może to być id
lub data utworzenia lub coś innego. Tabele SQL są z natury nieuporządkowane, więc nie istnieje coś takiego jak "poprzedni wiersz" bez kolumny określającej kolejność.
Należy pamiętać, że nie ma czegoś takiego jak „poprzedniego wiersza” w wyniku SQL ustawiony chyba użyć „BY” klauzuli aby określić kolejność. Powinieneś także spróbować myśleć w kategoriach zestawów z relacyjnymi bazami danych, więc mam nadzieję, że ktoś da ci pewną odpowiedź (muszę teraz wyjść). –
., Tak.Ale mogę to zdefiniować w kolejności według? Dzięki ... – Nemesis
Zarys (przepraszam muszę uruchomić): zdefiniuj WRT, który używa ORDER BY, aby wybrać zamówienie, a następnie używa [ROW_NUMBER] (http : //technet.microsoft.com/en-us/library/ms186734.aspx), aby dodać kolumnę definiującą zamówienie. Następnie połącz CTE ze sobą na x.ROWNUM = y.ROWNUM + 1 i dołącz wartość x.value-y.value. –