Выявление дублирующих транзакций в SQL - PullRequest
0 голосов
/ 02 июля 2019

Недавно из-за проблемы в базу данных были вставлены несколько повторяющихся транзакций в разные моменты времени. Нужно найти эти дубликаты транзакций и удалить их.

Я попытался сгруппировать участников и транзакции

   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 ]

1 голос
/ 02 июля 2019

Возможно, вы захотите самостоятельное присоединение :

  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 вы предоставляете свои дубликаты.

0 голосов
/ 02 июля 2019

Если вы хотите удалить эти транзакции:

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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...