Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come ottenere la differenza tra due righe per un campo colonna?

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)

MODIFICA:

A pensarci bene, l'uso di una sottoquery in select (risposta di ala Quassnoi) potrebbe essere più efficiente. Proverò diverse versioni e guarderò i piani di esecuzione per vedere quale funzionerebbe meglio in base alle dimensioni del set di dati che hai...


EDIT2:

Vedo ancora questo raccogliere voti, anche se è improbabile che molte persone utilizzino ancora SQL Server 2005.

Se hai accesso a funzioni in finestra come LEAD() , quindi usa quello invece...

SELECT
  RowInt,
  Value,
  LEAD(Value, 1, 0) OVER (ORDER BY RowInt) - Value
FROM
  sourceTable