繁体   English   中英

如何在一组行组中仅选择具有最新日期的行?

[英]How to select only the row with the latest date, in a set of groups of rows?

我们的代码中存在历史错误。 在一个表中,随着时间的推移,许多不同的记录将使用新信息进行更新,有时会在应该更新现有行的地方创建新行。

在后续查询中, 行数据被加载到我们的UI的单行中,而原始记录中的数据则被卡在那里,因为所有将来的更新都保存到了新行中,并且数据从旧记录中永久地加载了,无法保存回去。

我有一个查询,该查询以IDErrorGroupIDLastUpdatedDate的形式返回数据。 这给了我所有发生这种情况的行组。

所以:

ID   |ErrorGroupID|LastUpdatedDate
----------------------------------
1    |1           |01/01/2000
2    |1           |01/01/2001
3    |2           |01/01/2002
4    |2           |01/01/2003
5    |3           |01/01/2004
6    |3           |01/01/2005
7    |3           |01/01/2006

我需要删除具有特定ErrorGroupID所有行,但每个组中具有最高日期值的行除外。

我的SQL-fu似乎使我迷路了。 如何获取需要删除的行的ID值?

您可以直接将其删除:

delete from table
where
    ErrorGroupID = 1 
    and LastUpdatedDate < 
    (
        select 
            max(LastUpdatedDate)
        from
            table
        where
            ErrorGroupID = 1
    )

或者select ID from table如果您确实更喜欢获取ID而不是仅仅删除select ID from table则只需更改delete from tableselect ID from table

若要同时理解所有组(ErrorGroupID),请使用IN子句或将此查询加入到原始查询中。

您可以尝试以下查询

;WITH cte AS (
    SELECT ID
        , ErrorGroupID, LastUpdatedDate
        , ROW_NUMBER() OVER(PARTITION BY ErrorGroupID ORDER BY LastUpdatedDate DESC ) AS rownum
    FROM theTable
)
DELETE theTable 
FROM theTable
JOIN cte ON theTable.ErrorGroupID = cte.ErrorGroupID
WHERE cte.Rownum>1 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM