删除SQL中的每个备用行

时间:2012-08-13 09:00:07

标签: sql sql-server sql-server-2008-r2

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

SELECT * FROM [Records] ORDER BY [Timestamp]

然后删除每个备用行。

我在SO how to delete every alternate row in access table上找到了这个,但在这里并不真正适用,因为ID不是Int而是UID。

数据样本如下:

enter image description here

4 个答案:

答案 0 :(得分:15)

如果您使用的是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

答案 1 :(得分:2)

您可以使用更安全的变体而不是删除备用记录 - 只删除重复的观察,以便在数据出错时您不会失去同步:

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

答案 2 :(得分:1)

如果我没有弄错,你可以使用CTE,row_number()来有效地生成临时数字id列。然后可以应用相同的想法 - 删除行号mod 2为0的地方:

;WITH temp
     AS (SELECT *,
                Row_number() OVER (ORDER BY [Timestamp]) rn
         FROM   [Records]
         ORDER  BY [Timestamp])
DELETE FROM temp
WHERE  rn % 2 = 0

答案 3 :(得分:0)

你可以使用MOD运算符来划分两个数字并返回余数

DELETE FROM [Records] WHERE ([ID] Mod 2)=0)

将其放入循环中以删除所有备用行

所以例如

ID = 0;
rows = get_number_of_rows_in_the_table;
i = 0; // counter
while(i<rows) {
ID = get the ID of row 0
if(ID MOD 2 = 0) {
//perform delete operation
DELETE FROM [Records] WHERE ID=the ID you just got;
} else { 
increment the counter 
i++
}

这是一种解决方案,但不是正确的访问语法 希望它有所帮助