Sql 基于三列删除重复记录,但将高值记录保留在第四列

Sql 基于三列删除重复记录,但将高值记录保留在第四列,sql,date,ms-access,duplicates,sql-delete,Sql,Date,Ms Access,Duplicates,Sql Delete,我已经阅读了很多关于处理重复项的问题,它们帮助我编写了我所拥有的SQL,但我的任务是删除重复项,而不是基于重复项字段,而是基于另一个字段 在我的项目中,我根据三个列相等来定义重复项,但有一个第四列事务日期/时间永远不会重复。我想保留最新的交易,扔掉旧的交易 这是我已经有的 选择表A.Fld1、表A.Fld2、表A.Fld3、表A.Fld4、表A.Date 从表_中选择一个内部联接 从表A组中选择表A.Fld2、表A.Fld3、表A.Fld4,按表A.Fld2、表A.Fld3、表A.Fld4的计数

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

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

这是我已经有的 选择表A.Fld1、表A.Fld2、表A.Fld3、表A.Fld4、表A.Date 从表_中选择一个内部联接 从表A组中选择表A.Fld2、表A.Fld3、表A.Fld4,按表A.Fld2、表A.Fld3、表A.Fld4的计数*>1作为临时值 表A.Fld4=Temp.Fld4,表A.Fld3=Temp.Fld3,表A.Fld2=Temp.Fld2

这将生成一个重复列表

FLD_reUpdates_qry Fld2 Fld3 Fld4 Date_Updated 6 User_ID_lst 1394522856 6/21/2012 15:21:59 6 User_ID_lst 1394522856 6/21/2012 15:22:21 67 [Active?] 1099608160 6/19/2012 19:09:16 67 [Active?] 1099608160 6/19/2012 19:09:17 68 Url_lst 1107138998 6/21/2012 15:21:16 68 Url_lst 1107138998 6/21/2012 15:21:42 74 User_ID_lst 1044317178 6/21/2012 15:26:24 74 User_ID_lst 1044317178 6/21/2012 15:27:15 74 User_ID_lst 1044317178 6/21/2012 15:28:50
啊!!现在我有了一个我想要保留的列表,即使有记录74,我也只有最新的条目。但我真正想要的是删除其他重复项。这就是我似乎遇到精神障碍的地方。如何编写一个只删除保留最后一条记录的较旧重复项而不删除任何其他非重复记录的查询?

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

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    
)

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

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    
)
在这段代码中,使用查询FLD\u latestreuupdates\u Qry作为子查询,我删除了重复的行,只留下那些更新了最新日期的记录。此systax for DELETE对应于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
在这段代码中,使用查询FLD\u latestreuupdates\u Qry作为子查询,我删除了重复的行,只留下那些更新了最新日期的记录。此systax for DELETE对应于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

在这里,我更新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是一个对象,您可以使用相同的对象,也可以根据自己的意愿进行更改 您也可以在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是一个对象,您可以使用相同的对象或根据需要进行更改

子查询应仅包含更新为LatestUpdate的字段maxdate\u,以使其不起作用问题在于它删除所有其他记录,而不仅仅是不需要的重复记录。子查询应仅包含按顺序更新为LatestUpdate的字段maxdate\u对于不起作用的记录,问题是它会删除所有其他记录,而不仅仅是不必要的重复记录。好的!就这样!这将仅删除时间较早的重复记录。谢谢!我说得太快了。我正在使用MS Access,查询会创建一个要删除的记录的适当列表,但不会删除它们。进一步调查发现访问查询的组为“无法进行表更新”。有什么解决办法吗?啊。。我有一种感觉,这是访问,这不是一个小细节,你应该在你的问题中这样说。好的!就这样!这将仅删除时间较早的重复记录。谢谢!我说得太快了。我正在使用MS Access,查询会创建一个要删除的记录的适当列表,但不会删除它们。进一步调查发现访问查询的组为“无法进行表更新”。有什么解决办法吗?啊。。我有一种感觉,这是访问,这不是一个小细节,你应该在你的问题中这样说。