Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除重复,而不删除多次加载的数据_Sql_Db2 - Fatal编程技术网

Sql 删除重复,而不删除多次加载的数据

Sql 删除重复,而不删除多次加载的数据,sql,db2,Sql,Db2,我错误地将重复文件加载到数据库表中(IBMDB2V9.7)。我需要在不删除有效数据的情况下删除重复记录 起初,我认为使用count(*)>1作为问题的解决方案,但这行不通。我们的供应商生产具有修改规格的零件,因此可以使用有效数据多次加载文件 我知道一些事情: 我的重复记录的日期范围:介于“2012-08-27”和 ‘2012-09-02’ 用于验证数据的属性 这是我用来识别复制品的SQL代码: SELECT CAST(ENDDATE AS DATE) ENDDATE,CAST(LOADEDON

我错误地将重复文件加载到数据库表中(IBMDB2V9.7)。我需要在不删除有效数据的情况下删除重复记录

起初,我认为使用count(*)>1作为问题的解决方案,但这行不通。我们的供应商生产具有修改规格的零件,因此可以使用有效数据多次加载文件

我知道一些事情:

  • 我的重复记录的日期范围:介于“2012-08-27”和 ‘2012-09-02’
  • 用于验证数据的属性
  • 这是我用来识别复制品的SQL代码:

    SELECT CAST(ENDDATE AS DATE) ENDDATE,CAST(LOADEDON AS DATE),SUBSTR(SITEID,1,20) SITEID,SUBSTR(LOCATIONNAME_1,1,20),SUBSTR(RID,1,15),COUNT(RID) FROM AUTOMATION WHERE CAST(ENDDATE AS DATE) BETWEEN '2012-08-27' AND '2012-09-02' GROUP BY CAST(ENDDATE AS DATE),CAST(LOADEDON AS DATE),SUBSTR(SITEID,1,20),SUBSTR(LOCATIONNAME_1,1,20),SUBSTR(RID,1,15) ORDER BY 5 ASC FOR FETCH ONLY WITH UR
    
    编辑:可用于指定重复项的列集为RID、LOADEDON和FILENAME(此处未显示)

    这是一个示例输出

    08/29/2012 09/05/2012 JGS Memphis          JGS Memphis          029369751671            518
    09/01/2012 09/05/2012 Reynosa              Reynosa              029054883474            521
    08/29/2012 09/05/2012 JGS Memphis          JGS Memphis          028881223425            522
    
    我希望删除“2012-08-27”和“2012-09-02”时间范围内的所有重复记录,而不删除因合法原因加载N次的记录


    注意:该表没有主键(例如,在MS Sqlserver中,
    Rowid

    我不太清楚哪一组列指定了重复项。以下假设它是示例输出中的列:

    delete from (select t.*,
                        row_number() over (partition by enddate, loadedon, siteid order by loadedon desc) as seqnum
                 from automation t
                ) t
    where seqnum > 1
    

    这将使用row_number()来分配序列号,并删除除第一行以外的所有行,以确保其中一行保留在数据库中。

    我不太清楚哪一组列指定了重复。以下假设它是示例输出中的列:

    delete from (select t.*,
                        row_number() over (partition by enddate, loadedon, siteid order by loadedon desc) as seqnum
                 from automation t
                ) t
    where seqnum > 1
    

    这将使用row_number()分配序列号并删除除第一行以外的所有行,以确保其中一行保留在数据库中。

    除非您有办法区分与其他记录完全相同但良好的记录和与其他记录完全相同的记录,但这不好,那就真的没有办法了。还是我遗漏了问题中的某些内容?

    除非你有办法区分与其他记录完全相同但很好的记录与与与其他记录完全相同但不好的记录之间的区别,否则真的没有办法做到这一点。还是我漏掉了问题中的某些内容?

    你就不能做一个回滚吗?今天早上发现了错误。这事发生在上周。我太晚了。你不能做一个回滚吗?今天早上发现了错误。这事发生在上周。我来晚了。