我有一个具有用户字段状态的表,其值为0或1.由于几年前创建的编码错误,无论该值是否实际更改,都会添加一个新条目。该表具有DateModified列,用于创建条目的时间。
我想要做的是将表减少到只交替(振荡?)值,最早的新值是每次都保留的行。一个例子将使这一点更加清晰:
目前的情况如下:
DateMod Value
6:05 pm 0
6:01 pm 0
5:47 pm 0
5:33 pm 1
5:15 pm 1
4:07 pm 0
3:58 pm 1
2:23 pm 0
表格应该是什么样的:
DateMod Value
5:47 pm 0
5:15 pm 1
4:07 pm 0
3:58 pm 1
2:23 pm 0
希望这是有道理的。这一定是可能的,对吧?
答案 0 :(得分:5)
这将在SQL Server 2008中有效。我使用time
作为DateMod
的数据类型,但如果您使用datetime
则相同。可以在SQL Server 2005中使用Common Table Express和row_number。
-- Sample table
declare @T table(DateMod time, Value bit)
insert into @T values
('6:05 pm', 0),
('6:01 pm', 0),
('5:47 pm', 0),
('5:33 pm', 1),
('5:15 pm', 1),
('4:07 pm', 0),
('3:58 pm', 1),
('2:23 pm', 0)
-- Delete using row_number and cte
;with cte as
(
select *,
row_number() over(order by DateMod) as rn
from @T
)
delete C2
from cte as C1
inner join cte as C2
on C1.rn+1 = C2.rn and
C1.Value = C2.Value
-- Result
select *
from @T
结果:
DateMod Value
---------------- -----
17:47:00.0000000 0
17:15:00.0000000 1
16:07:00.0000000 0
15:58:00.0000000 1
14:23:00.0000000 0