Sql server 如何删除select query over子句中的重复记录

Sql server 如何删除select query over子句中的重复记录,sql-server,over-clause,Sql Server,Over Clause,我在SQL SERVER中有如下事务表 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

我在SQL SERVER中有如下事务表

 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
我想查询此表以获取任何特定日期的可用余额。所以我使用了窗口功能

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

是我的sql FIDLE吗

在窗口函数之前,您可以
求和
,如:

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

使用
范围
而不是

此变体生成的结果集与最初请求的结果集不同,但在某些情况下可能有用。此变量返回的行数与
Transactions
表中的行数相同。因此,它将返回两行
2015-10-03
,但对于这两行
AvailableBalance
将是
1804


我只是想强调一下,这里有一个选项
范围
。如果您确实需要每天一行,那么首先按天分组,如@lad2025的答案所示。

OP必须添加
DISTINCT
。两个重复的钥匙被带回来了
2015-10-03 1804
@EvaldasBuinauskas,是的,你是对的。此变体生成的结果集与最初请求的结果集不同,但在某些情况下可能有用。我只是想强调一下,这里有一个选项
范围
。如果你真的需要每天排一行,那么首先按照@lad2025的答案按天分组是最好的选择。不要争论。这确实是一个非常有用的提示。
SELECT
  TransactionDate,  
  SUM(Amount) OVER (
    PARTITION BY UserId 
    ORDER BY TransactionDate 
    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS AvailableBalance
FROM Transactions;