【问题标题】:Removing duplicate records based on three cols but keeping the records with the highes value in a forth col基于三列删除重复记录,但将具有最高值的记录保留在第四列中
【发布时间】:2012-06-23 03:20:33
【问题描述】:

我已经阅读了很多关于处理重复项的问题,它们帮助我编写了我拥有的 SQL,但我的任务是删除重复项,而不是基于重复字段,而是基于另一个字段。

在我的项目中,我根据三个列相等来定义重复项,但是有一个永远不会*重复的第四列事务日期/时间。我想保留最新的交易并丢弃旧的交易。

这是我已经拥有的
SELECT Table_A.Fld1, Table_A.Fld2, Table_A.Fld3, Table_A.Fld4, Table_A.Date_Updated FROM Table_A INNER JOIN (SELECT Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 FROM Table_A GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 HAVING count(*)>1) AS Temp ON (Table_A.Fld4 = Temp.Fld4) AND (Table_A.Fld3 = Temp.Fld3) AND (Table_A.Fld2 = Temp.Fld2);

这会产生一个重复列表

FLD_reUpdates_qry
Fld2 Fld3 Fld4 Date_Updated
6 用户 ID_lst 1394522856 2012 年 6 月 21 日 15:21:59
6 用户 ID_lst 1394522856 2012 年 6 月 21 日 15:22:21
67 [活跃?] 1099608160 2012 年 6 月 19 日 19:09:16
67 [活动?] 1099608160 2012 年 6 月 19 日 19:09:17
68 Url_lst 1107138998 2012 年 6 月 21 日 15:21:16
68 Url_lst 1107138998 2012 年 6 月 21 日 15:21:42
74 用户 ID_lst 1044317178 2012 年 6 月 21 日 15:26:24
74 用户 ID_lst 1044317178 2012 年 6 月 21 日 15:27:15
74 用户 ID_lst 1044317178 2012 年 6 月 21 日 15:28:50

这很好,我有重复的列表,你可以看到记录 74 有三个重复。但我想要的只是最新时间的副本。 所以我有这个查询..
SELECT max(date_updated) AS LatestUpdate, Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 FROM Table_A GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 HAVING count(1)> 1;
这会产生以下列表...

FLD_LatestReupdates_Qry
最新更新 Fld2 Fld3 Fld4
2012 年 6 月 21 日 15:22:21 6 User_ID_lst 1394522856
2012 年 6 月 19 日 19:09:17 67 [活动?] 1099608160
2012 年 6 月 21 日 15:21:42 68 Url_lst 1107138998
2012 年 6 月 21 日 15:28:50 74 用户 ID_lst 1044317178


啊!现在我有一个我想要保留的列表,即使有记录 74 我也只有最新的条目。但我真正想要的是删除其他重复项。这就是我似乎遇到了心理障碍的地方。如何编写一个只删除较旧的重复项(保留最后一个)而不删除任何其他非重复记录的查询?

【问题讨论】:

    标签: sql date ms-access duplicates sql-delete


    【解决方案1】:

    使用您的查询 FLD_LatestReupdates_Qry 作为此代码中的子查询,我删除了重复的行,只留下那些具有最新 date_updated 的记录。这个 DELETE 的 systax 对应于 Sql Server,如果你想要它用于不同的后端,它可能需要做一些小改动。

    DELETE A 
    FROM Table_A A
    INNER JOIN 
    ( SELECT max(date_updated) AS LatestUpdate, Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 
        FROM Table_A 
    GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 HAVING count(1)> 1 
    ) B
    ON A.Fld2 = B.Fld2 AND A.Fld3 = B.Fld3 AND A.Fld4 = B.Fld4
    WHERE A.date_updated < B.LatestUpdate
    

    【讨论】:

    • 好的!就是这样!这仅删除具有较早时间的重复记录。谢谢
    • 啊!我说得太早了。我正在使用 MS Access,查询创建了一个要删除的正确记录列表,但不会删除它们。进一步调查发现,使用 Group on 的 Access 查询无法进行表更新。有什么解决办法吗?
    • 啊.. 我感觉是 Access,这不是一个小细节,你应该在你的问题中这么说。
    【解决方案2】:

    现在您有了一个选择您想要保留的内容的查询,您可以创建一个删除查询来删除该查询未返回的任何内容。所以,你可以像这样包装你的查询:

    DELETE FROM Table_A
    WHERE date_updated NOT IN (
      SELECT max(date_updated) 
      FROM Table_A GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 
      HAVING count(1)> 1    
    )
    

    【讨论】:

    • 子查询应该只包含字段 max(date_updated) AS LatestUpdate 以使 NOT IN() 起作用
    • 这样做的问题是它会删除所有其他记录,而不仅仅是不需要的重复记录。
    【解决方案3】:

    在这里我更新 SQL 代码以删除重复项,只留下第一条记录 您也可以在 Access 2007 中使用此代码......

    DELETE *
        FROM Test
        WHERE ID NOT IN (SELECT * 
                            FROM (SELECT MIN(n.ID)
                                    FROM Test n
                                GROUP BY n.Projects));
    

    Test 是一个表名..

    Projects是要消除重复项的字段名称

    n 是一个对象,您可以使用相同的对象或随意更改

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-20
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2021-03-18
      • 1970-01-01
      相关资源
      最近更新 更多