在SQL中识别重复事务

时间:2019-07-02 08:34:40

标签: mysql sql

最近由于一个问题,在不同的时间将多个重复的事务插入到数据库中。需要找到那些重复的交易并将其删除。

我尝试将成员和交易分组

   select count(*),
          member_id,
          TRUNC(created, 'DDD') 
     from TXN
    where created > TO_DATE('06/01/2019 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
 group by member_id,
          TRUNC(created, 'DDD') 
   having count(*) > 2;

我需要在10分钟的时间内为同一成员创建的所有交易。

示例:

MEMBER_ID  ROW_ID  ORG  DEST  Created
1-FRGD     1-FGTH  YFG  DFG   10-01-2019 00:00:00:00
1-FRGD     1-TYHG  THU  SEF   10-01-2019 00:00:09:12
1-FGHR     1-FTGH  TGH  DRF   10-01-2019 00:01:03:25

在此示例中,我需要前两个txns作为输出,因为如果时差不超过10分钟且具有相同的成员号,

2 个答案:

答案 0 :(得分:1)

您可能希望自我加入

  select a.Member_Id as Member_Id,
         a.Row_Id    as Row_Id, 
         a.Org       as Org,  
         a.Dest      as Dest ,
         a.Created   as Created,
         b.Row_Id    as Duplicate_Row_Id, 
         b.Org       as Duplicate_Org,  
         b.Dest      as Duplicate_Dest,
         b.Created   as Duplicate_Created 
    from TXN a inner join
         TXN b on a.Member_Id = b.Member_Id and 
                  a.Created < b.Created and
                  TIMESTAMPDIFF(a.Created, b.Created) / 60 <= 10
order by a.Member_Id

对于TNX中的每条记录,请提供其重复项。

答案 1 :(得分:0)

如果您想删除这些交易:

delete tnext
    from txn tnext join
         txn t
         on tnext.member_id = t.member_id and
            tnext.created > t.created and
            tnext.created < t.created + interval 10 minute
   where t.created > '2019-06-01';

在实际表上运行此表之前,请确保备份表并使用select测试逻辑。

如果您只想选择没有重复项的交易,则建议使用not exists

select t.*
from txn t
where not exists (select 1
                  from t tprev
                  where tprev.member_id = t.member_id and
                        tprev.created < t.created and
                        tprev.created > t.created - interval 10 minute
                 ) and
      t.created >= '2019-06-01';