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

时间:2014-09-04 16:02:58

标签: sql sql-server

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

在后续查询中,来自两个行的数据被加载到我们的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值?

2 个答案:

答案 0 :(得分:1)

您可以直接删除它:

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

如果您真的更愿意获取ID而不是仅删除它,只需将delete from table更改为select ID from table

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

答案 1 :(得分:1)

您可以尝试以下查询

;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