DB2 SQL — удаление дубликатов, где некоторые дубликаты допустимы

#sql #db2 #duplicates #ibm-midrange

#sql #db2 #дубликаты #ibm-средний уровень

Вопрос:

Я хотел бы удалить повторяющиеся записи из XRDK / ENAUDFP_RK, я попробовал предложение ‘where exists’ с приведенным ниже SQL, но это удалило все записи в файле, а не только дубликаты.

Чтобы дать небольшую справку; проблема здесь заключается в дублирующемся файле ежедневных продаж — магазин вполне может продавать более 1 одного и того же товара в день, поэтому некоторые из дубликатов на самом деле не являются дубликатами, только каждая вторая строка является дубликатом.

Т.е. если магазин продал 2 из них один и тот же товар, было бы 4 записи — 2 подлинные продажи, 2 дубликата.

Это SQL, который я использовал для выделения дубликатов;

 SELECT * FROM                                                     
  (SELECT ROWNUMBER() OVER (                                      
   PARTITION BY                                                   
   INCOMP, INTTYP, INTDAT, INMDAT, INSDAT, INTCCY, INERAT, INDEPT,
   INSTYL, INCOLO, INMATL, INSIZE, INFIT, INVENX, INEAN, INSKU,   
   INBATC, INPSIT, INFSIT, INTSIT, INSUPP, INPONO, INSCCY, INREF1,
   INREF2, INREF3, INSREF, INDREF, INUNIT, INRETL, INCOST, INLRET,
   INLCST, INSCST, INFGRP, INFCAT, INFSEC, INTGRP, INTCAT, INTSEC,
   INSTEN, INSTEV, INSVAT, INPLUL, INSVTF, INSFOR, INSFOV, INVCOD,
   INTO01, INSP01, INSP02, INSP03, INFNUM, INFDES, INRCOD, INRC01,
   INRC02, INRC03, INRC04, INRC05, INRC06, INRC07, INRC08, INRC09,
   INRC10, INRV01, INRV02, INRV03, INRV04, INRV05, INRV06, INRV07,
   INRV08, INRV09, INRV10, INDELD, INCUID, INIREF, INSOUR, INSNUM)
   AS RN, ENAUDFP_RK.*                                            
   FROM   XRDK/ENAUDFP_RK) AS A                                   
 WHERE RN in('2', '4', '6', '8', '10', '12')
  

Комментарии:

1. Итак, комбинация хранилища / элемента УНИКАЛЬНА …?

2. Нет. Причина этого заключается в том, что у вас могут быть скидки на скидки или скидки для персонала и т. Д., Которые Применяются в PoS, Поэтому фактически предложенная цена для магазина / товара (и связанные с этим другие значения, такие как НДС, маржа и т. Д.) Могут Отличаться Между транзакциями для одного и того же магазина / товара. Вот почему мое предложение partion by использует все поля в таблице, потому что фактически это уровень, на котором запись становится УНИКАЛЬНОЙ.

Ответ №1:

Вы можете использовать rrn для этого в DB2

 DELETE FROM XRDK/ENAUDFP_RK f0
WHERE rrn(f0) in (
 SELECT RW FROM                                                     
 (SELECT ROWNUMBER() OVER (                                      
 PARTITION BY                                                   
 INCOMP, INTTYP, INTDAT, INMDAT, INSDAT, INTCCY, INERAT, INDEPT,
 INSTYL, INCOLO, INMATL, INSIZE, INFIT, INVENX, INEAN, INSKU,   
 INBATC, INPSIT, INFSIT, INTSIT, INSUPP, INPONO, INSCCY, INREF1,
 INREF2, INREF3, INSREF, INDREF, INUNIT, INRETL, INCOST, INLRET,
 INLCST, INSCST, INFGRP, INFCAT, INFSEC, INTGRP, INTCAT, INTSEC,
 INSTEN, INSTEV, INSVAT, INPLUL, INSVTF, INSFOR, INSFOV, INVCOD,
 INTO01, INSP01, INSP02, INSP03, INFNUM, INFDES, INRCOD, INRC01,
 INRC02, INRC03, INRC04, INRC05, INRC06, INRC07, INRC08, INRC09,
 INRC10, INRV01, INRV02, INRV03, INRV04, INRV05, INRV06, INRV07,
 INRV08, INRV09, INRV10, INDELD, INCUID, INIREF, INSOUR, INSNUM)
 AS RN, f1.*, rrn(f1) RW                                            
 FROM   XRDK/ENAUDFP_RK f1) AS A                                   
 WHERE A.RN in('2', '4', '6', '8', '10', '12')
 )
  

Комментарии:

1. Именно то, что я искал, протестировал, и это сработало отлично.

Ответ №2:

Если вы можете идентифицировать дубликаты, вы можете удалить их. Мой пример показывает это с таблицей «e2»

 delete from (
  select * from (
      select rownumber() over (partition by .....) as rn,
             e2.* 
        from e2)
   where  mod(rn, 2) = 0 )
  

Мод в моем примере используется для идентификации каждой второй строки.
Вы уже на правильном пути с идеей rownumber().

Комментарии:

1. Это кажется интересным из-за функции ‘mod’ — я не слышал об этом, но синтаксис инструкции кажется неправильным. Я добавил в раздел по информации, которую вы пропустили, но после этого имя моего файла не упоминается, и поэтому оператор не работает. Я более чем способен разобраться, как заставить его работать, но предложение Esperento57 сработало.