この質問に密接に関連するSQLの質問があります-SQL-重複したレコードを見つける必要がありますが、EXCLUDEはトランザクションを逆にしました
(可能であれば) 非手続き型 SQL を使用して、レコードセットの反転 "ペア" をすべて削除する必要があります。特定の rdbms は Oracle 11g ですが、SQL Server 2008 で同じ戦略を使用できるように、SQL をできるだけ一般的なものにしたいと考えています。レコードセットの例は次のようになります。
ROW | DATE | QTY | FUEL_TYPE | REVERSAL |
1 | 01-MAY-12 | 23.3 | DSL | N |
2 | 01-MAY-12 | -23.3 | DSL | Y |
3 | 01-MAY-12 | 23.3 | DSL | N |
4 | 01-MAY-12 | 23.3 | DSL | N |
5 | 01-MAY-12 | 23.3 | DSL | N |
6 | 01-MAY-12 | 18.6 | DSL | N |
7 | 01-MAY-12 | -18.6 | DSL | Y |
8 | 01-MAY-12 | 14.9 | GAS | N |
クエリの望ましい結果は、このレコードセットを次のように減らします。
ROW | DATE | QTY | FUEL_TYPE | REVERSAL |
3 | 01-MAY-12 | 23.3 | DSL | N |
4 | 01-MAY-12 | 23.3 | DSL | N |
5 | 01-MAY-12 | 23.3 | DSL | N |
8 | 01-MAY-12 | 14.9 | GAS | N |
重複は可能ですが、反転「ペア」は常に削除する必要があることに注意してください。
edit 行と行番号は無関係であり、単に説明するために使用されています。どのレコードが削除されるかは問題ではなく、常に「ペア」、つまりプラスの金額とマイナスの金額が存在するということだけです。したがって、たとえば、行 2 を 1、3、4、または 5 とペアにして削除することができます。
また、テーブルとテーブル構造自体にデータを入力するロジックは、ベンダー ソフトウェアによって制御され、リバーサル レコードでリバースされるレコードの元の ID は含まれません。私は本当にこれを制御することはできません。 /編集
ちなみに、MINUS キーワードが UNION および UNION ALL と同様に機能するように変更された場合、MINUS は 2 番目のレコードセットから一致する単一の行セットのみを削除しますが、MINUS ALLは 2 番目の値に一致するすべての行を削除します。レコードセット。もしそうなら、この問題は些細なことです (少なくとも私の脳が考える方法では)。