【问题标题】:Exclude duplicate records except for one different field排除除一个不同字段之外的重复记录
【发布时间】:2016-09-15 04:42:23
【问题描述】:

我有一个包含客户编号、日期、金额和交易类型(买入或卖出)的交易清单。我只想退回未被相同客户、日期和金额取消但交易类型相反的交易(按客户、按天、按金额)。

例如,我的示例表(事务)如下:

+------------+------------+--------+--------+ |客户 |日期 |金额 |行动 | +------------+------------+--------+--------+ | 1111 | 2016 年 9 月 15 日 | 5 |购买 | |第2222章2016 年 9 月 15 日 | 5 |出售 | |第3333章2016 年 9 月 15 日 | 6 |购买 | |第3333章2016 年 9 月 15 日 | 6 |出售 | | 4444 | 2016 年 9 月 15 日 | 7 |出售 | |第2222章2016 年 9 月 15 日 | 6 |购买 | +------------+------------+--------+--------+

我只希望退回以下物品:

+------------+------------+--------+--------+ |客户 |日期 |金额 |行动 | +------------+------------+--------+--------+ | 1111 | 2016 年 9 月 15 日 | 5 |购买 | |第2222章2016 年 9 月 15 日 | 5 |出售 | | 4444 | 2016 年 9 月 15 日 | 7 |出售 | |第2222章2016 年 9 月 15 日 | 6 |购买 | +------------+------------+--------+--------+

客户 3333 被排除在外,因为他们在同一天有相同价值的买入和卖出金额。客户 2222 已被留下,即使他们在同一天进行了买卖,但金额不同,所以我需要返回这两个记录。

【问题讨论】:

  • 每个客户每天只有一次买卖?
  • 是的。每个客户每个日期最多只能有 1 次买入和 1 次卖出。但是某些客户可能在该日期只能执行 1 次操作,例如上面的1111和4444分别只有1买入和1卖出。

标签: sql sql-server sql-server-2008


【解决方案1】:

这就够了:

SELECT Customer, Date, Amount, MAX(Action) Action
FROM Src
GROUP BY Customer, Date, Amount
HAVING COUNT(*)=1

测试用例

WITH Src AS
(
    SELECT * FROM (VALUES
    (1111, '15/09/2016', 5, 'Buy'),
    (2222, '15/09/2016', 5, 'Sell'),
    (3333, '15/09/2016', 6, 'Buy'),
    (3333, '15/09/2016', 6, 'Sell'),
    (4444, '15/09/2016', 7, 'Sell'),
    (2222, '15/09/2016', 6, 'Buy')
    ) T(Customer, Date, Amount, Action)
)
SELECT Customer, Date, Amount, MAX(Action) Action
FROM Src
GROUP BY Customer, Date, Amount
HAVING COUNT(*)=1

结果

Customer    Date       Amount      Action
----------- ---------- ----------- ----
1111        15/09/2016 5           Buy
2222        15/09/2016 5           Sell
2222        15/09/2016 6           Buy
4444        15/09/2016 7           Sell

【讨论】:

  • 这将包括 3333 15/09/2016 6 卖出?
  • 我误解了问题。已更新。
  • 啊,聪明!我没有想到那个选项,并且正在努力使用更复杂的 CTE 方法。不错!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2012-12-24
相关资源
最近更新 更多