排除除一个不同字段以外的重复记录

问题描述:

我有包含客户编号,日期,金额和交易类型(买入或卖出)的交易列表。我只想返回未被相同客户,日期和金额取消但具有相反交易类型的交易(每位客户,每天,每笔金额)。排除除一个不同字段以外的重复记录

例如,我的示例表(交易)低于:

 
+----------+------------+--------+--------+ 
| 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已被留下,尽管他们在同一天进行了买卖,这是针对不同的金额,所以我需要为他们返回两个记录。

+1

每个客户都只有一个销售和每日期买? –

+0

是的。每个客户每个日期最多只有1次购买和1次出售。但有些客户可能只对该日期有一个动作,例如以上1111和4444分别只有1个买入和1个卖出。 – Goolsy

这将是不够的:

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 
+0

这将包括3333 15/09/2016 6卖出? –

+0

我误解了问题。更新。 –

+0

啊,聪明!我没有想到这个选择,并且正在用更复杂的CTE方法挣扎。太好了! –