2014-08-28 69 views
6

SQL Server 2008 R2。唯一ID的连续行值之间的差异

我需要根据共同的唯一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和4在这种情况下]

我还需要找到的差异[排 - 排+ 1] 我看到了一个几个堆栈溢出的答案,但他们似乎并不适用于这种情况。

+1

您需要指定“连续行”的含义。 SQL Server如何知道-154.5在-103之前? (另外,如果AccountNumber在两行中可以具有相同的值,则它不是唯一的。) – 2014-08-28 20:16:51

+2

表代表无序集。因此,除非你明确地有一个列的顺序 - 通常是一个id或创建日期,否则不存在“连续的行”。你的数据没有这样的列,因此它没有“连续行”。 – 2014-08-28 20:17:16

+0

编辑,以包括ValueDate作为参考点的连接性[不知道这是一个字] – GVashist 2014-08-28 20:26:01

回答

7

您可以用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是可选的,但是用于开始对组中每个值的编号,即:如果对于每个唯一的AccountNumber值,编号将从1开始。ORDER BY当然用于定义编号应该如何去,并且在ROW_NUMBER()功能中是必需的。

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

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

+0

完美。我取代了???与Aaron和Gordon建议的ValueDate一样,我也有我需要的数据。 – GVashist 2014-08-28 20:27:41

+0

+1用于解释您已完成的工作以及为什么应该起作用。 – GVashist 2014-08-29 13:17:49