sql >> Databasteknik >  >> RDS >> Sqlserver

Hur får man skillnaden mellan två rader för ett kolumnfält?

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


  1. Hur du säkerställer att databaser säkerhetskopieras regelbundet

  2. Hur kan jag göra något som:ANVÄND @databaseName

  3. Dela upp strängen i rader Oracle SQL

  4. 7645 Null eller tomt fulltextpredikat