2014-08-28 17 views
6

SQL Server 2008 R2.Sự khác biệt giữa các giá trị trong các hàng liên tiếp cho số duy nhất của

Tôi cần tìm sự khác biệt giữa các hàng liên tiếp dựa trên ID duy nhất, phổ biến.

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  

Cột khác biệt là những gì tôi đang cố tạo. Tôi cần tìm sự khác biệt giữa các hàng liên tiếp CHỈ NẾU:

Có nhiều hơn 1 hàng cho một Số tài khoản cụ thể.


tôi quản lý để loại bỏ các hàng với 1 giá trị/ACCOUNTNUMBER [hàng 1 và 4 trong trường hợp này]

tôi vẫn cần phải tìm sự khác biệt từ [hàng - hàng + 1] tôi thấy một vài câu trả lời trên Stack overflow nhưng chúng dường như không áp dụng cho kịch bản này.

+1

Bạn cần chỉ định "hàng liên tiếp" có nghĩa là gì. Làm thế nào để SQL Server biết rằng -154.5 đến trước -103? (Ngoài ra, AccountNumber không phải là duy nhất nếu nó có thể có cùng giá trị trong hai hàng.) –

+2

Các bảng biểu diễn các tập hợp không theo thứ tự. Do đó, không có thứ như "hàng liên tiếp" trừ khi bạn có một cột với thứ tự - thường là một id hoặc ngày tạo. Dữ liệu của bạn không có cột như vậy, do đó nó không có "hàng liên tiếp". –

+0

Đã chỉnh sửa để bao gồm ValueDate làm điểm tham chiếu cho liên tiếp [không chắc chắn đó là một từ] – GVashist

Trả lời

7

Bạn có thể làm điều này với ROW_NUMBER() chức năng:

;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 

Chức năng ROW_NUMBER() gán một số để mỗi hàng. PARTITION BY là tùy chọn, nhưng được sử dụng để bắt đầu đánh số cho từng giá trị trong một nhóm, ví dụ: nếu bạn PARTITION BY AccountNumber thì giá trị số AccountNumber sẽ bắt đầu tại 1. ORDER BY tất nhiên được sử dụng để xác định cách đánh số và được yêu cầu trong hàm ROW_NUMBER().

Được sử dụng trong cte, bạn có thể tự tham gia bằng cách sử dụng ROW_NUMBER() để bù lại bản ghi của 1 bản ghi, cho phép so sánh giữa các hàng.

Trong SQL Server 2012, các chức năng LEAD()LAG() cho phép so sánh chéo chéo đơn giản hơn.

+0

Hoàn hảo. Tôi đã thay thế ??? với ValueDate như đề xuất của Aaron và Gordon và tôi có dữ liệu tôi cần. – GVashist

+0

+1 để giải thích những gì bạn đã làm và lý do tại sao nó hoạt động. – GVashist

Các vấn đề liên quan