我有一个表格transactions
下面:
| id | type | transaction |
| 1 | A | 100 |
| 2 | B | -500 |
| 3 | A | 300 |
| 4 | A | 400 |
| 5 | A | 500 |
| 6 | B | -300 |
| 7 | B | -100 |
| 8 | A | 100 |
| 9 | B | -100 |
| 10 | A | 100 |
| 11 | B | -100 |
| 12 | A | 100 |
基本上,对于每种类型的交易A
transaction
金额将为正数,对于每种类型的交易B
transaction
金额将为负数。(B 是 A 的反向交易(。
编写 sql select 语句以过滤掉所有事务及其否定事务的最佳方法是什么,并且只保留未反转的事务。
| id | type | transaction |
| 4 | A | 400 |
| 12 | A | 100 |
附言。没有A
,就不会有任何B
类型的交易。
如果有 1-1 的对应关系,那么not exists
工作得很好:
select t.*
from transactions t
where not exists (select 1
from transaction t2
where t2.type <> t.type and t2.transaction = - t.transaction
);
当一笔交易可以有多个相同的金额时,这尤其会失败。 为此,我可能会建议使用聚合:
select amount, sum(type = 'A') as num_as, sum(type = 'B') as num_bs
from transactions t
group by abs(amount)
having sum(amount) <> 0;
这不会返回原始行,但它确实显示了内容未对齐的位置。