2016-09-15 10 views
0

顧客番号、日付、金額、取引タイプ(売買)を含む取引のリストがあります。私は、同じ顧客、日付、金額ではなく反対の取引タイプで取り消されない取引(顧客ごと、1日あたり、金額ごと)を返すだけです。1つの異なるフィールドを除いて重複レコードを除外します

例えば、私のサンプルテーブル(取引)は以下の通りです:

 
+----------+------------+--------+--------+ 
| 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回の販売が日付ごとに行われます。しかし、一部の顧客は、その日のアクションを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アプローチに苦しんでいました。ニース! –

関連する問題