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

How to remove the duplicate records in select query over clause

我在 SQL 服务器中进行如下交易 table。

 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

我想查询此 table 以获得任何特定日期的可用余额。所以我为此使用了窗口函数。

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

但是由于交易 table 有日期 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 fiddle

您可以 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

使用 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;

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

我只是想强调有那个选项 RANGE。如果您真的需要每天一行,那么首先按照 @lad2025 的回答按天分组是可行的方法。