2014-08-28 34 views
6

SQL Server 2008 R2.Benzersiz ID'ler için birbirini takip eden satırlardaki değerler arasındaki fark

Genel, benzersiz bir kimlik temelinde ardışık satırlar arasındaki farkı bulmam gerekiyor.

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  

Fark sütununda üretmeye çalıştığım şey. Aşağıdaki tabloda birbirini izleyen satırlar arasındaki farkı bulmam gerekiyor YALNIZCA IF:

Belirli bir AccountNumber için 1'den fazla satır var.


I/AccountNumber [bu durumda satır 1 ve 4] 1 değeri ile satırları kaldırmak için yönetilen

Hala farkını bulmalıyız

[satır - sıranın + 1] gördüğüm bir Yığın taşmasıyla ilgili yanıtların bir çift, ancak bu senaryoyu uygulamak için görünmüyor.

+1

"Ardışık satırların" ne anlama geldiğini dikte etmeniz gerekir. SQL Server -154.5'ün -103'ten önce geldiğini nasıl biliyor? (Aynı zamanda, iki satırda aynı değere sahip olabilirse, AccountNumber benzersiz değildir.) –

+2

Tablolar, sırasız kümeleri temsil eder. Bu nedenle, siparişle bir sütuna sahip olmadıkça "ardışık satır" diye bir şey yoktur - tipik olarak bir kimlik veya oluşturma tarihi. Verilerinizde böyle bir sütun yok, dolayısıyla "ardışık satır" yok. –

+0

ValueDate'i, birebirlilik için bir referans noktası olarak dahil etmek üzere düzenlenmiştir [bu bir sözcük olup olmadığından emin değil] – GVashist

cevap

7

Sen ROW_NUMBER() fonksiyonu ile yapabilirsiniz:

;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() işlev her satır için bir numara atar. PARTITION BY isteğe bağlıdır, ancak bir gruptaki her bir değer için numaralandırma işlemini başlatmak için kullanılır, yani: PARTITION BY AccountNumber ise, her bir benzersiz AccountNumber değeri için numaralandırma 1'den başlayacak. ORDER BY, numaralamanın nasıl gidileceğini tanımlamak için kullanılır. ve ROW_NUMBER() işlevinde gereklidir.

Bir cte kullanildiginda, birlestirmek için ROW_NUMBER() kullanarak birlestirebilirsiniz.

SQL Server 2012'de LEAD() ve LAG() işlevleri, daha basit çapraz satır karşılaştırmaları sağlar.

+0

Mükemmel. Ben ??? Aaron ve Gordon tarafından önerildiği gibi ValueDate ile ve ihtiyacım olan verilere sahibim. Ne yaptığınızı ve neden işe yarayacağını açıklayan – GVashist

+0

+1. – GVashist