我需要清理一个包含三列的表,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。
数据样本如下:
答案 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++
}
这是一种解决方案,但不是正确的访问语法 希望它有所帮助