删除SQL中的每个备用行
我需要清理一个有三列的表,ID(uniqueidentifier)、Observation(nvarchar)和Timestamp(datetimeoffset)。内容由两个传感器每隔1小时生成,两个传感器的观察值相同。我的想法是执行选择查询,如删除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或更
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++
}