如何从SQL表中删除非每个组中最大记录的内容。

16 浏览
0 Comments

如何从SQL表中删除非每个组中最大记录的内容。

此问题已经在这里有了答案:

如何删除重复行?

我有一个如下模式的表:

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仅与一条消息相关联。

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

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

现在,我希望编写一个DELETE语句,删除与上面查询返回的记录相匹配的项目。记录必须基于ID UpdateTime 的值进行删除。我只是不明白如何在Transact-SQL中表达这一点。

admin 更改状态以发布 2023年5月20日
0
0 Comments

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
        )

我发现这种相关子查询更易读。

0
0 Comments

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部分有多个表达式。

0