Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como obter a diferença entre duas linhas para um campo de coluna?

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)


EDITAR:

Pensando nisso, usar uma subconsulta no select (resposta de ala Quassnoi) pode ser mais eficiente. Eu testaria versões diferentes e examinaria os planos de execução para ver qual teria o melhor desempenho no tamanho do conjunto de dados que você tem ...


EDIT2:

Ainda vejo isso ganhando votos, embora seja improvável que muitas pessoas ainda usem o SQL Server 2005.

Se você tiver acesso a funções com janela, como LEAD() , então use isso em vez disso ...
SELECT
  RowInt,
  Value,
  LEAD(Value, 1, 0) OVER (ORDER BY RowInt) - Value
FROM
  sourceTable