3

我在 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 小提琴

4

2 回答 2

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
于 2015-10-07T10:46:22.550 回答
1

使用RANGE而不是ROWS.

SQL小提琴

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 的回答按天分组是可行的方法。

于 2015-10-07T11:11:20.290 回答