SQL:根据交替值删除额外的行

时间:2011-07-06 18:34:38

标签: sql

我有一个具有用户字段状态的表,其值为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

希望这是有道理的。这一定是可能的,对吧?

1 个答案:

答案 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