sql >> Database >  >> RDS >> Sqlserver

Hoe krijg ik het verschil tussen twee rijen voor een kolomveld?

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)

BEWERKEN:

Als je erover nadenkt, kan het efficiënter zijn om een ​​subquery in de select te gebruiken (ala Quassnoi's antwoord). Ik zou verschillende versies uitproberen en kijken naar de uitvoeringsplannen om te zien welke het beste zou presteren op de grootte van de dataset die je hebt...


EDIT2:

Ik zie nog steeds dat dit stemmen verzamelt, hoewel het onwaarschijnlijk is dat veel mensen nog steeds SQL Server 2005 gebruiken.

Als u toegang hebt tot vensterfuncties zoals LEAD() , gebruik dat dan...

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


  1. Hoe TO_BASE64() werkt in MariaDB

  2. TRUNC(datum) Functie in Oracle

  3. Wat is het gebruik van de vierkante haken [] in sql-statements?

  4. SQLite onUpgrade() frustratie