删除SQL中的每个备用行

Jim*_*Jim 8 sql sql-server sql-server-2008-r2

我需要清理一个有三列的表,ID(uniqueidentifier),Observation(nvarchar)和Timestamp(datetimeoffset).内容由两个传感器以1小时间隔生成,并且观察值与两个传感器相同.我的想法是做一个SELECT查询,如

SELECT * FROM [Records] ORDER BY [Timestamp]
Run Code Online (Sandbox Code Playgroud)

然后删除每个备用行.

我在SO上发现了如何删除访问表中的每个备用行,但这里并不真正适用,因为ID不是Int而是UID.

数据样本如下所示:

在此输入图像描述

Mik*_*son 16

如果您使用的是SQL Server 2005或更高版本,则可以执行以下操作.

delete T
from (
       select row_number() over(order by [Timestamp]) as rn
       from YourTable
       where SomeColumn = @SomeValue
     ) T
where T.rn % 2 = 0
Run Code Online (Sandbox Code Playgroud)


Nik*_*vić 5

您可以使用更安全的变体,而不是删除备用记录 - 仅删除重复的观察结果,这样在数据出现错误的情况下,您就不会失去同步:

; with cte as (
  select *,
         row_number() over (partition by Observation 
                            order by [Timestamp]) rn
    from [Records]
)
delete cte
 where rn > 1
Run Code Online (Sandbox Code Playgroud)