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)
REDIGERA:
Om du tänker på det kan det vara mer effektivt att använda en underfråga i select (ala Quassnois svar). Jag skulle testa olika versioner och titta på exekveringsplanerna för att se vilken som skulle fungera bäst på storleken på datamängden som du har...
EDIT2:
Jag ser fortfarande att detta får röster, även om det är osannolikt att många fortfarande använder SQL Server 2005.
Om du har tillgång till Windowed-funktioner som LEAD()
, använd det istället...
SELECT
RowInt,
Value,
LEAD(Value, 1, 0) OVER (ORDER BY RowInt) - Value
FROM
sourceTable