如何删除 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
在窗口函数之前,例如:
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
。
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 的回答按天分组是可行的方法。
我在 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
在窗口函数之前,例如:
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
。
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 的回答按天分组是可行的方法。