Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie erhalte ich den Unterschied zwischen zwei Zeilen für ein Spaltenfeld?

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)

BEARBEITEN:

Wenn Sie darüber nachdenken, ist die Verwendung einer Unterabfrage in der Auswahl (ala Quassnois Antwort) möglicherweise effizienter. Ich würde verschiedene Versionen testen und mir die Ausführungspläne ansehen, um zu sehen, welche bei der Größe des Datensatzes, den Sie haben, am besten funktioniert ...


BEARBEITEN2:

Ich sehe immer noch, dass dies Stimmen sammelt, obwohl es unwahrscheinlich ist, dass viele Leute immer noch SQL Server 2005 verwenden.

Wenn Sie Zugriff auf Fensterfunktionen wie LEAD() haben , dann benutze das stattdessen...

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