2016-10-12 4 views
0

Я хотел бы удалить повторяющиеся записи из XRDK/ENAUDFP_RK, я пробовал предложение «где существует» с приведенным ниже SQL, но это удалило все записи в файле, а не только дубликаты.DB2 SQL - удалять дубликаты, где допустимы некоторые дубликаты

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

I.e. если магазин продал 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

Так комбо магазин/пункт UNIQUE ...? –

+0

Нет. Причина в том, что у вас могут быть диспутционные скидки или скидки для персонала и т. Д., Которые применяются в PoS, так эффективно предлагаемая цена за магазин/товар (и связанные с ним другие значения с такой цифрой, как НДС, маржа и т. Д. .) могут отличаться между транзакциями для одного и того же магазина/предмета. Вот почему мое предложение partion by использует все поля в таблице, потому что эффективно это уровень, на котором запись становится UNIQUE. – RDKells

ответ

1

Вы можете использовать лп для этого в 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') 
) 
+0

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

0

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

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

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

+0

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