2015-10-07 78 views
3

選擇查詢中的重複記錄我在SQL SERVER中具有Transactions表如下。如何刪除條款

UserID  TranDate  Amount 
    1 | 2015-04-01 | 0 
    1 | 2015-05-02 | 5000 
    1 | 2015-09-07 | 1000 
    1 | 2015-10-01 | -4000 
    1 | 2015-10-02 | -700 
    1 | 2015-10-03 | 252 
    1 | 2015-10-03 | 260 
    1 | 2015-10-04 | 1545 
    1 | 2015-10-05 | 1445 
    1 | 2015-10-06 | -2000 

我想查詢此表以獲得任何特定日期的可用餘額。所以我使用了Windowing函數。

SELECT TransactionDate, 
    SUM(Amount) OVER (PARTITION BY UserId ORDER BY TransactionDate ROWS 
BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM Transactions 

但是,由於事務處理表的重複條目爲2015-10-03,因此它將重複日期爲2015-10-03的數據。每當我有相同的日期時,我都會預計該日期的最後一個記錄,總結可用餘額。

電流輸出

TransactionDate  AvailableBalance 
    2015-04-01  |  0 
    2015-05-02  |  5000 
    2015-09-07  |  6000 
    2015-10-01  |  2000 
    2015-10-02  |  1300 
    2015-10-03  |  1552 
    2015-10-03  |  1804 
    2015-10-04  |  3349 
    2015-10-05  |  4794 
    2015-10-06  |  2794 

預計:我想從上面的結果集中刪除下面的記錄。

2015-10-03  |  1552 

HERE是我的SQL小提琴

回答

4

您可以SUM前窗功能,如:

SqlFiddleDemo

WITH cte AS 
(
    SELECT TransactionDate, UserId, SUM(Amount) AS Amount 
    FROM Transactions 
    GROUP BY TransactionDate, UserId 
) 
SELECT TransactionDate, 
     SUM(Amount) OVER (PARTITION BY UserId ORDER BY TransactionDate ROWS 
    BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS AvailableBalance 
FROM cte 
1

使用RANGE而不是ROWS

SQL Fiddle

SELECT 
    TransactionDate, 
    SUM(Amount) OVER (
    PARTITION BY UserId 
    ORDER BY TransactionDate 
    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS AvailableBalance 
FROM Transactions; 

這種變異產生不同的結果集,比原先的要求,但它可能在某些情況下非常有用。該變量返回與Transactions表中相同的行數。因此,它將返回2015-10-03兩行,但兩行AvailableBalance將爲1804

我只是想強調,有這個選項RANGE。如果你真的每天需要一行,那麼按照@ lad2025的回答,一開始就按日進行分組是最好的選擇。

+0

OP將不得不添加'DISTINCT'。兩個重複的鍵被帶回'2015-10-03 1804' –

+0

@EvaldasBuinauskas,是的,你是對的。該變體產生的結果集與最初請求的結果集不同,但在某些情況下可能會有用。我只是想強調有這個選項'RANGE'。如果你真的每天需要一行,那麼按照@ lad2025的回答,一開始就按日進行分組是最好的選擇。 –

+0

不爭論。這確實是一個非常有用的提示。 –