排除除一个不同字段以外的重复记录
我有包含客户编号,日期,金额和交易类型(买入或卖出)的交易列表。我只想返回未被相同客户,日期和金额取消但具有相反交易类型的交易(每位客户,每天,每笔金额)。排除除一个不同字段以外的重复记录
例如,我的示例表(交易)低于:
+----------+------------+--------+--------+ | Customer | Date | Amount | Action | +----------+------------+--------+--------+ | 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 | +----------+------------+--------+--------+
我只想以下项目返回:
+----------+------------+--------+--------+ | Customer | Date | Amount | Action | +----------+------------+--------+--------+ | 1111 | 15/09/2016 | 5 | Buy | | 2222 | 15/09/2016 | 5 | Sell | | 4444 | 15/09/2016 | 7 | Sell | | 2222 | 15/09/2016 | 6 | Buy | +----------+------------+--------+--------+
客户3333已经被排除在外,因为他们有一个买入和在同一天出售相同价值的金额。客户2222已被留下,尽管他们在同一天进行了买卖,这是针对不同的金额,所以我需要为他们返回两个记录。
这将是不够的:
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方法挣扎。太好了! –
每个客户都只有一个销售和每日期买? –
是的。每个客户每个日期最多只有1次购买和1次出售。但有些客户可能只对该日期有一个动作,例如以上1111和4444分别只有1个买入和1个卖出。 – Goolsy