Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak uzyskać różnicę między dwoma wierszami dla pola kolumny?

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)

EDYTUJ:

Myśląc o tym, użycie podzapytania w select (odpowiedź ala Quassnoi) może być bardziej wydajne. Wypróbowałbym różne wersje i przyjrzałbym się planom wykonania, aby zobaczyć, które będą działać najlepiej w przypadku rozmiaru zestawu danych, który posiadasz...


EDIT2:

Nadal widzę, że to zbiera głosy, chociaż jest mało prawdopodobne, że wiele osób nadal używa SQL Server 2005.

Jeśli masz dostęp do funkcji okienkowych, takich jak LEAD() , a następnie użyj tego zamiast...

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Optymalizacja TempDB:unikanie wąskich gardeł i problemów z wydajnością

  2. Jak przekazać tablicę ciągów w parametrze SQL do klauzuli IN w SQL?

  3. 2 sposoby na uzyskanie informacji o partycjach dla tabeli w SQL Server (T-SQL)

  4. Jak ręcznie wstawić wartość w kolumnie tożsamości w tabeli SQL Server — samouczek SQL Server / T-SQL, część 41

  5. Jak zmienić nazwę kolumny lub nazwę tabeli w SQL Server — samouczek SQL Server / T-SQL, część 36