删除所有不是最新的记录

时间:2016-08-13 21:01:58

标签: stored-procedures duplicates sql-server-2014 sql-delete

我有一张故意重复的表。在这种情况下,将要复制的东西是deviceId和datetime。有时客户会更新他们的数据。该表有三列,deviceId,datetime和value(有一个增量主键)。有时,当客户重新评估他们的数据时,他们会注意到该值不正确,然后他们更新它并发送数据以进行重新处理。因此,我需要能够删除不是最新记录的记录。我不能在datetime之前做,因为在某些情况下这也会重复,我无法截断登台表。

要删除欺骗,我有以下内容:

;WITH DupeData AS (
SELECT ROW_NUMBER() OVER(PARTITION BY tblMeterData_Id,fldDateTime, fldValue, [fldBatchId],[fldProcessed] ORDER BY fldDateTime) AS ROW
FROM [Stage.tblMeterData])
DELETE FROM DupeData 
WHERE ROW > 1

这个问题,似乎是删除随机副本。

我想保留暂存区域中的最新记录,并删除不是最新记录的任何其他记录。然后,我可以使用最新数据更新相关行,当我将其从分段转换为prod时。

1 个答案:

答案 0 :(得分:0)

是桌面上的任何主键还是唯一键? 如果有唯一的ID - 下面最简单的方法 不确定性能,但应该少量工作

DELETE FROM DupeData 
where id in 
(select id from 
( SELECT id, 
  ROW_NUMBER() OVER(PARTITION BY tblMeterData_Id,fldDateTime, fldValue, [fldBatchId],[fldProcessed] ORDER BY fldDateTime) AS ROW 
FROM [Stage.tblMeterData]) 
) q
 where q.row > 1)