2014-08-28 47 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

相關問題