Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да получите разлика между два реда за поле на колона?

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)

РЕДАКТИРАНЕ:

Като се замислим, използването на подзаявка в избрания (отговорът на ала Quassnoi) може да бъде по-ефективно. Бих пробвал различни версии и бих разгледал плановете за изпълнение, за да видя коя ще се представи най-добре при размера на набора от данни, който имате...


РЕДАКТИРАНЕ 2:

Все още виждам, че това събира гласове, макар че е малко вероятно много хора все още да използват SQL Server 2005.

Ако имате достъп до функции с прозорец, като LEAD() , след това използвайте това вместо...

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. Как да конвертирате празни пространства в нулеви стойности, като използвате SQL Server?

  2. Предотвратете запазването на промени, които изискват пресъздаване на таблицата, отрицателни ефекти

  3. Внедряване на общ индикатор за производителност на MS SQL Server

  4. Как да коригирате „Процедурата очаква параметър „@statement“ от тип „ntext/nchar/nvarchar“.“ Грешка в SQL Server

  5. Проактивни проверки на състоянието на SQL Server, част 1:Дисково пространство