如何从SQL表中删除不是组的最大值的记录[重复]

Posted

技术标签:

【中文标题】如何从SQL表中删除不是组的最大值的记录[重复]【英文标题】:How delete records that are not the maximum of a group from an SQL table [duplicate] 【发布时间】:2013-10-18 05:24:40 【问题描述】:

我有一个具有以下架构的表:

ID NVARCHAR(10)
Message NVARCHAR(300)
UpdateTime DATETIME

其中 ID 是外键。新消息记录添加到具有相同UpdateTime 的集群中。例如(按IDUpdateTime 排序):

ID   | Status        | UpdateTime
---------------------------------
42     Cluster1-Msg1   2012-12-25
42     Cluster1-Msg2   2012-12-25
42     Cluster2-Msg1   2013-10-10
42     Cluster2-Msg2   2013-10-10
43     Cluster4-Msg1   2011-11-27

这里 ID #42 与 4 条消息相关联,在不同日期分为两组,而 ID #43 仅与一条消息相关联。

有时我希望通过删除该组中UpdateTime 小于组内最大值的所有消息记录来清除此表,对于具有相同 ID 的每个组。上面示例中的最终结果是:

42     Cluster2-Msg1   2013-10-10
42     Cluster2-Msg2   2013-10-10
43     Cluster4-Msg1   2011-11-27

以下 SQL 查询定位到我要删除的所有记录:

SELECT Msgs.ID, Msgs.UpdateTime
FROM Messages Msgs
JOIN
(SELECT ID, MAX(UpdateTime) AS MaxTime FROM Messages GROUP BY ID) MaxTimes
ON Msgs.ID = MaxDates.ID
WHERE Msgs.UpdateTime < MaxTimes.MaxTime

现在我想编写一个删除语句,删除与上面查询返回的项目匹配的项目。这 必须根据 IDUpdateTime 值删除记录。我只是不明白如何在 Transact-SQL 中表达这一点。

【问题讨论】:

如果有副本怎么办?您要保留两者还是只保留一个? 将表视为包含消息组(组键是 ID 列)。我想删除任何“旧”消息,即日期小于每个组中最大日期的消息。 您也可以使用ROW_NUMBER 这里我希望删除不符合某些条件(早于最大日期)的记录,而不是删除重复项。碰巧,其他问题的公认答案是以类似的方式实现的。 @JohnKällén - 不,这是一回事。其中重复行定义为具有相同的 ID 值。在链接的问题中,重复项被定义为具有相同的 Col1,Col2,Col3 值,但在其他列中可能不同。 【参考方案1】:
DELETE Msgs 
FROM Messages Msgs
JOIN (SELECT ID, MAX(UpdateTime) AS MaxTime FROM Messages GROUP BY ID) MaxTimes
    ON Msgs.ID = MaxDates.ID
WHERE Msgs.UpdateTime < MaxTimes.MaxTime

请注意,我所做的只是复制您原来的 SELECT 语句,并将第一行代码从 SELECT ... 更改为 DELETE Msgs。您必须指定表名,因为查询的 FROM 部分中有多个表表达式。

【讨论】:

刚刚在我的机器上验证了这一点。工作一种享受。感谢您的及时答复!【参考方案2】:
DELETE  DUB
FROM    Messages AS DUB
WHERE   EXISTS (
            SELECT  SUB.ID
            FROM    Messages AS SUB
            WHERE   SUB.ID = DUB.ID
            GROUP BY SUB.ID
            HAVING MAX(SUB.UpdateTime) > DUB.UpdateTime
        )

我发现这种相关的子查询更具可读性。

【讨论】:

以上是关于如何从SQL表中删除不是组的最大值的记录[重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除一张表中重复数据并保留一条ID最小的记录

如何从表中删除重复记录? [复制]

sql中如何删除一个表中重复的记录?

如何从 MySQL 表中删除重复记录? [复制]

SQL:查找每组的最大记录[重复]

SQL:查找每组的最大记录[重复]