唯一ID的连续行中的值之间的差异

时间:2014-08-28 20:16:10

标签: sql sql-server data-manipulation

SQL Server 2008 R2。

我需要根据一个共同的唯一ID找到连续行之间的差异。

Data:

AccountNumber   ValueDate     CustomerName        Amount           Difference

     1           06/01/2014   Customer Name 1   -3436.184178    
     2           06/03/2014   Customer Name 2   -154.5               -51.5
     2           06/15/2014   Customer Name 2   -103    
     3           06/02/2014   Customer Name 3   -45289.44   
     4           06/20/2014   Customer Name 4   -4907.52             -1116.43
     4           06/25/2014   Customer Name 4   -3791.09             -3791.09
     4           06/30/2014   Customer Name 4   -3302.19    

差异列是我尝试生成的内容。 我只需要找到连续行之间的差异:

特定AccountNumber有超过1行。


我设法删除了1个值/ AccountNumber [在这种情况下为行1和4]

的行

我仍然需要找到与[row - row + 1]的区别 我在Stack溢出时看到了几个答案,但它们似乎并不适用于这种情况。

1 个答案:

答案 0 :(得分:8)

您可以使用ROW_NUMBER()功能执行此操作:

;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY AccountNumber ORDER BY ValueDate) AS RN 
              FROM YourTable)
SELECT a.*,a.Amount - b.Amount AS Diff
FROM cte a
LEFT JOIN cte b
  ON a.AccountNumber = b.AccountNumber
  AND a.RN = b.RN -1

ROW_NUMBER()函数为每一行分配一个数字。 PARTITION BY是可选的,但用于为组中的每个值开始编号,即:如果您PARTITION BY AccountNumber,那么对于每个唯一AccountNumber值,编号将从1开始。{ {1}}当然用于定义编号应该如何进行,并且在ORDER BY函数中是必需的。

在cte中使用后,您可以使用ROW_NUMBER()自行连接以将连接偏移1个记录,从而允许在行之间进行比较。

在SQL Server 2012中,ROW_NUMBER()LEAD()函数允许更简单的跨行比较。