2016-10-12 11 views
0

XRDK/ENAUDFP_RKから重複レコードを削除したいのですが、以下のSQLでwhere where句を試しましたが、重複します。DB2 SQL - 一部の重複が有効な重複を削除します

少し背景があります。ここで問題となるのは、複製された1日の販売ファイルです。つまり、店舗が1日に同じアイテムを1つ以上販売することは完全に可能です。したがって、重複の一部は実際には重複しません。

I.e.ある店が同じ商品を2つ売った場合、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

で、このためにRRNを使用することができますか...? –

+0

いいえ、この理由は、PoSで適用される割引割引やスタッフ割引などがありますので、ストア/アイテム(およびVAT、マージンなどの数字と関連付けられている他の値)の入札価格。)は、同じ店舗/商品のトランザクション間で異なる場合があります。 これは、私のpartion by句が、実際にはレコードが一意になるレベルなので、テーブルのすべてのフィールドを使用する理由です。 – RDKells

答えて

1

そんなに店/アイテムコンボがUNIQUEである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) 

この例のmodは、2番目ごとの行を識別するために使用されます。 rownumber()のアイデアを使って、適切なトラックにbneenがあります。

+0

これは面白いですが、 'mod'関数のためです。私はこれについては聞いていませんが、文の構文が正しいとは思われません。 私はあなたが盗んだ情報でパーティションに追加しましたが、後で私のファイル名について言及していないので、そのようなステートメントは機能しません。私はそれを働かせることを考え出す以上の能力を持っていますが、Esperento57の提案は治療になりました。 – RDKells