2016-09-15 78 views
0

我有包含客戶編號,日期,金額和交易類型(買入或賣出)的交易列表。我只想返回未被相同客戶,日期和金額取消但具有相反交易類型的交易(每位客戶,每天,每筆金額)。排除除一個不同字段以外的重複記錄

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

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

回答

2

這將是不夠的:

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方法掙扎。太好了! –