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