2016-08-13 50 views
0

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

要删除受骗者我有以下几点:

;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 

的问题,这一点,是它似乎删除随机重复。

我想保留暂存区域中的最新记录并删除不是最新记录的其他记录。然后,我可以用新数据和最新数据更新相关行,当我把它从升级到产品时。

+0

在桌子上的任何主要或唯一键? 'DELETE FROM DupeData 其中id在从( SELECT ID,ROW_NUMBER()OVER(PARTITION BY tblMeterData_Id,fldDateTime,fldValue,[fldBatchId],[fldProcessed] ORDER BY fldDateTime)AS ROW FROM [阶段 (选择ID。 tblMeterData]) )q 其中q.row> 1)' – are

+0

只有我用来发送表的增量Id。 –

+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) 
+0

我试图说,没有记录生效,即使我知道我有四个重复的每个设备Id。我试过摆弄它,并没有发现任何可以删除的模式。 –

+0

酷得到它的工作细 –

+0

DELETE FROM [Stage.tblMeterData] \t WHERE ID IN \t( \t \t SELECT ID FROM \t \t( \t \t \t SELECT ID,ROW_NUMBER()OVER(PARTITION BY tblMeterData_Id,fldDateTime ORDER BY fldDateTime DESC)AS ROW \t \t \t FROM [Stage.tblMeterData] \t \t)为q \t \t WHERE QR OW> 1 \t) –

相关问题