2014-08-28 15 views
6

SQL Server 2008 R2.Differenza tra valori in righe consecutive per ID univoci

Devo trovare la differenza tra righe consecutive basate su un ID comune e univoco.

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  

La colonna delle differenze è ciò che sto cercando di generare. Devo trovare la differenza tra le righe consecutive SOLO SE:

C'è più di 1 riga per un particolare numero di conto.


sono riuscito a rimuovere le righe con 1 valore/AccountNumber [righe 1 e 4 in questo caso]

ho ancora bisogno di trovare la differenza tra [fila - fila + 1] vidi un un paio di risposte su Stack overflow ma non sembrano applicabili a questo scenario.

+1

È necessario dettare cosa significa "righe consecutive". In che modo SQL Server sa che -154,5 è arrivato prima del -103? (Inoltre, AccountNumber non è univoco se può avere lo stesso valore in due righe.) –

+2

Le tabelle rappresentano insiemi non ordinati. Quindi, non esiste una "riga consecutiva" a meno che non si disponga esplicitamente di una colonna con l'ordinamento, in genere un ID o una data di creazione. I tuoi dati non hanno tale colonna, quindi non ha "riga consecutiva". –

+0

Modificato per includere ValueDate come punto di riferimento per la consecutività [non è sicuro se sia una parola] – GVashist

risposta

7

È possibile farlo con la funzione 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 

La funzione ROW_NUMBER() assegna un numero a ogni riga. PARTITION BY è facoltativo, ma utilizzato per iniziare la numerazione per ogni valore in un gruppo, ad esempio: se si specifica , la numerazione ricomincia da 1. ORDER BY ovviamente viene utilizzata per definire la modalità di numerazione, ed è richiesto nella funzione ROW_NUMBER().

Utilizzato in una cte, è possibile eseguire l'auto join mediante lo ROW_NUMBER() per compensare il join di 1 record, consentendo il confronto tra le righe.

In SQL Server 2012 le funzioni LEAD() e LAG() consentono confronti di più file incrociati.

+0

Perfetto. Ho sostituito il ??? con ValueDate come suggerito da Aaron e Gordon e ho i dati di cui ho bisogno. – GVashist

+0

+1 per spiegare cosa hai fatto e perché dovrebbe funzionare. – GVashist