SELECT
[current].rowInt,
[current].Value,
ISNULL([next].Value, 0) - [current].Value
FROM
sourceTable AS [current]
LEFT JOIN
sourceTable AS [next]
ON [next].rowInt = (SELECT MIN(rowInt) FROM sourceTable WHERE rowInt > [current].rowInt)
BEWERKEN:
Als je erover nadenkt, kan het efficiënter zijn om een subquery in de select te gebruiken (ala Quassnoi's antwoord). Ik zou verschillende versies uitproberen en kijken naar de uitvoeringsplannen om te zien welke het beste zou presteren op de grootte van de dataset die je hebt...
EDIT2:
Ik zie nog steeds dat dit stemmen verzamelt, hoewel het onwaarschijnlijk is dat veel mensen nog steeds SQL Server 2005 gebruiken.
Als u toegang hebt tot vensterfuncties zoals LEAD()
, gebruik dat dan...
SELECT
RowInt,
Value,
LEAD(Value, 1, 0) OVER (ORDER BY RowInt) - Value
FROM
sourceTable