从查询中删除匹配的行对

时间:2019-12-10 23:38:09

标签: sql

我正在尝试从SQL数据库生成报告。

数据为交易记录,有时由于操作员错误而输入了错误的记录,后者为更正此错误而输入了相同的记录,但数量为负。

ID, DESC  , QTY
0 , ITEM1 , 2
1 , ITEM2 , 1
2 , ITEM3 , 2     // This record and
3 , ITEM2 , 1
4 , ITEM3 , -2    // this record cancel out

我想查询一个查询,该查询对除了ID之外相同并且在QTY上具有相反符号且不包括在结果中的行对。

类似于以下内容。

ID, DESC  , QTY
0 , ITEM1 , 2
1 , ITEM2 , 1
3 , ITEM4 , 1

在查询中实现此目的最简单的方法是什么?我一直在考虑聚合SUM函数的思路,但是我只想删除QTY值相反但幅度相等的行。

2 个答案:

答案 0 :(得分:1)

您可以使用left join反样式来逐出存在相同desc而相反qty的另一条记录的记录。

select t.*
from mytable t
left join mytable t1 on t1.desc = t.desc and t1.qty = - t.qty
where t1.id is null

或带有关联子查询的not exists条件:

select t.*
from mytable t
where not exists (
    select 1
    from mytable t1
    where t1.desc = t.desc and t1.qty = - t.qty
)

答案 1 :(得分:1)

这很痛苦。您问题的直接答案是not exists。但是,您需要注意重复项,因此建议您先枚举值:

with t as (
      select t.*,
             row_number() over (partition by desc, qty order by id) as seqnum
      from transactions t
     )
select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.desc = t.desc and
                        t2.seqnum = t.seqnum and
                        t2.qty = - t.qty
                 );