Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除SQL中的每个备用行_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

删除SQL中的每个备用行

删除SQL中的每个备用行,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我需要清理一个有三列的表,ID(uniqueidentifier)、Observation(nvarchar)和Timestamp(datetimeoffset)。内容由两个传感器每隔1小时生成,两个传感器的观察值相同。我的想法是执行选择查询,如 SELECT * FROM [Records] ORDER BY [Timestamp] 然后删除每个备用行 我发现它是这样的,但实际上并不适用于这里,因为ID不是Int而是UID 数据示例如下所示: 如果您使用的是SQL Server 2005或更

我需要清理一个有三列的表,ID(uniqueidentifier)、Observation(nvarchar)和Timestamp(datetimeoffset)。内容由两个传感器每隔1小时生成,两个传感器的观察值相同。我的想法是执行选择查询,如

SELECT * FROM [Records] ORDER BY [Timestamp]
然后删除每个备用行

我发现它是这样的,但实际上并不适用于这里,因为ID不是Int而是UID

数据示例如下所示:


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

如果我没弄错的话,您可以使用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

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

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

您可以使用MOD运算符来执行此操作,它将两个数字相除并返回余数

试一试

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

比如说

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++
}
ID=0;
rows=获取\u表中的\u行数\u;
i=0;//柜台

虽然(iis)时间戳对于那些重复的行来说完全相等?仅供参考,CTE仅在您使用SQL Server 2005或更高版本时可用-您没有在问题中指定版本。是的,我在SQL Server 2008 R2上。是否可以为SELECT添加WHERE子句?例如delete t from(SELECT row_number())[DateTime])作为rn从[Records]开始,其中[Timestamp]<'2012/6/30 12:00am')T其中T.rn%2=0@Jim当然可以。您可以在内部查询中进行操作。我已经在查询中添加了一个where子句示例。如果可以避免,请不要循环。SQL中有更有效的方法来执行操作。@漏洞没有必要进行否决投票!这已经6年了,您的评论毫无意义。请展示一种更好的方法,而不是对实际的解决方案进行否决投票不管你喜欢与否,这仍然是一个解决方案
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++
}