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溢出时看到了几个答案,但它们似乎并不适用于这种情况。
答案 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()
函数允许更简单的跨行比较。