DB2 SQL - 删除某些重复项有效的重复项

DB2 SQL - Remove duplicates where some duplicates are valid

我想从 XRDK/ENAUDFP_RK 中删除重复记录,我已经尝试使用下面 SQL 的 'where exists' 子句,但这删除了文件中的所有记录,而不仅仅是重复记录.

提供一些背景知识;这里的问题是重复的每日销售文件 - 一家商店完全有可能每天销售超过 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')

如果您可以识别重复项,则可以将其删除。我的示例显示了 table "e2"

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

我示例中的mod用于标识每隔一行。 您的 rownumber() 想法已经走在正确的轨道上了。

您可以在 DB2 中为此使用 rrn

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')
 )