我们的代码中存在历史错误。在随着时间的推移使用新信息更新许多不同记录的表中,有时会创建一个新行,其中现有行应该已更新。
在后续查询中,来自两个行的数据被加载到我们的UI的单行中,并且来自原始记录的数据被卡在那里,因为所有将来的更新都会保存到新行,并且数据从旧记录中永久加载,无法保存回来。
我的查询以ID
,ErrorGroupID
,LastUpdatedDate
的形式返回数据。这给了我发生这种情况的所有行组。
所以:
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值?
答案 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