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)
MODIFIER :
En y réfléchissant, l'utilisation d'une sous-requête dans la sélection (réponse d'ala Quassnoi) peut être plus efficace. J'essaierais différentes versions et j'examinerais les plans d'exécution pour voir lequel fonctionnerait le mieux sur la taille de l'ensemble de données que vous avez...
EDIT2 :
Je vois toujours cela recueillir des votes, bien qu'il soit peu probable que beaucoup de gens utilisent encore SQL Server 2005.
Si vous avez accès à des fonctions fenêtrées telles que LEAD()
, alors utilisez-le à la place...
SELECT
RowInt,
Value,
LEAD(Value, 1, 0) OVER (ORDER BY RowInt) - Value
FROM
sourceTable