Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment obtenir la différence entre deux lignes pour un champ de colonne ?

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