if object_id('tempdb..#tmp') is not null     
drop table #tmp GO
 ----创建测试数据 
declare @t table(S_DATA int,S_TIME int,S_ID int) 
insert @t 
select 3,        12,      null union all select 2,        13,      null union all select 2,        14,      null union all select 1,        15,      null union all select 4,        16,      null union all select 5,        17,      null union all select 3,        18,      null union all select 3,        19,      null union all select 2,        20,      null union all select 4,        21,      null union all select 1,        22,      null union all select 2,        23,      null union all select 3,        24,      null union all select 5,        25,      null union all select 3,        26,      null union all select 2,        27,      null union all select 6,        28,      null union all select 2,        29,      null union all select 3,        30,      null union all select 4,        31,      null union all select 1,        32,      null union all select 1,        33,      null union all select 2,        34,      null union all select 5,        35,      null union all select 2,        36,      null union all select 3,        37,      null union all select 4,        38,      null union all select 1,        39,      null union all select 2,        40,      null union all select 3,        41,      null   
----从上至下更新 
declare @data int,@flag int set @flag = 1  
UPDATE @t SET 
/*使用@data作为判断S_DATA连续为4,5,6无效数据的标志*/
@data = case
 when @data between 4 and 6 and S_DATA between 4 and 6 then 888 else S_DATA 
end, 
@flag =  
case  
when S_DATA between 1 and 3 then @flag 
when S_DATA between 4 and 6 and @data <> 888 then @flag + 1 
else 1 
end, 
S_ID =  
case  
when S_DATA between 4 and 6  then null  
else @flag  end  
----生成用于从下至上更新的临时表 
select * into #tmp from @t order by S_TIME DESC  
----从上至下更新临时表(相当于从下至上更新原表) 
declare @ bit     
/*更新S_ID时使用的判断标志*/ 
set @flag = 1  
UPDATE #tmp SET 
@ =  
case  
when @ = 1 then 1  
else  
case when S_DATA = 6 then 1 end 
/*如果遇到S_DATA = 6的行,则之后的行禁止被更新*/ 
end, 
/*使用@data作为判断S_DATA连续为4,5,6无效数据的标志*/ 
@data = 
case 
when @data between 4 and 6 and S_DATA between 4 and 6 then 888 else S_DATA 
end, 
@flag =  
case  
when S_DATA between 1 and 3 then @flag 
when S_DATA between 4 and 6 and @data <> 888 then @flag + 1 
when S_DATA between 4 and 6 and @data = 888 then @flag else 1 
end, 
S_ID = 
case 
when @ = 1 then S_ID    /*第一次更新时S_DATA = 6之前的行的S_ID不再更新,保持原值*/ else  
case  
when S_DATA between 4 and 6 then null  
else @flag  
end  
end  
----更新原表的S_ID 
update a set S_ID = b.S_ID from @t as a  
inner join #tmp as b on a.S_DATA = b.S_DATA and a.S_TIME = b.S_TIME  
 ----查看更新 
select * from @t  
----清除测试环境 
drop table #tmp

解决方案 »

  1.   

    但是我用这组数据测试就错了: 
    select 3,        12,      null union all 
    select 2,        13,      null union all 
    select 2,        14,      null union all 
    select 1,        15,      null union all 
    select 4,        16,      null union all 
    select 5,        17,      null union all 
    select 4,        16,      null union all 
    select 4,        16,      null union all 
    select 3,        18,      null union all 
    select 3,        19,      null union all 
    select 2,        20,      null union all 
    select 4,        21,      null union all 
    select 1,        22,      null union all 
    select 2,        23,      null union all 
    select 3,        24,      null union all 
    select 5,        25,      null union all 
    select 4,        16,      null union all 
    select 4,        16,      null union all 
    select 4,        16,      null union all 
    select 3,        26,      null union all 
    select 2,        27,      null union all 
    select 6,        28,      null union all 
    select 2,        29,      null union all 
    select 3,        30,      null union all 
    select 4,        31,      null union all 
    select 1,        32,      null union all 
    select 1,        33,      null union all 
    select 2,        34,      null union all 
    select 5,        35,      null union all 
    select 2,        36,      null union all 
    select 3,        37,      null union all 
    select 4,        38,      null union all 
    select 1,        39,      null union all 
    select 2,        40,      null union all 
    select 3,        41,      null
      

  2.   

    对不起大家,第一组数据给错了,是:
    select 3,        12,      null union all 
    select 2,        13,      null union all 
    select 2,        14,      null union all 
    select 1,        15,      null union all 
    select 4,        16,      null union all 
    select 5,        17,      null union all 
    select 3,        18,      null union all 
    select 3,        19,      null union all 
    select 2,        20,      null union all 
    select 4,        21,      null union all 
    select 1,        22,      null union all 
    select 2,        23,      null union all 
    select 3,        24,      null union all 
    select 5,        25,      null union all 
    select 3,        26,      null union all 
    select 2,        27,      null union all 
    select 6,        28,      null union all 
    select 2,        29,      null union all 
    select 3,        30,      null union all 
    select 4,        31,      null union all 
    select 1,        32,      null union all 
    select 1,        33,      null union all 
    select 2,        34,      null union all 
    select 5,        35,      null union all 
    select 2,        36,      null union all 
    select 3,        37,      null union all 
    select 4,        38,      null union all 
    select 1,        39,      null union all 
    select 2,        40,      null union all 
    select 3,        41,      null
      

  3.   

    if object_id('tempdb..#tmp') is not null     
    drop table #tmp 
    GO把GO單獨入一行試試
      

  4.   

    在我这是另起一行的,搞到CSDN上就乱了,对不起,没发好帖子
      

  5.   

    题目数据结果3 12 1
    2 13 1
    2 14 1
    1 15 1
    4 16 NULL
    5 17 NULL
    3 18 1
    3 19 1
    2 20 1
    4 21 NULL
    1 22 2
    2 23 2
    3 24 2
    5 25 NULL
    3 26 3
    2 27 3
    6 28 NULL
    2 29 4
    3 30 4
    4 31 NULL
    1 32 3
    1 33 3
    2 34 3
    5 35 NULL
    2 36 2
    3 37 2
    4 38 NULL
    1 39 1
    2 40 1
    3 41 1
      

  6.   

    2楼数据结果   都可以执行啊
    3 12 1
    2 13 1
    2 14 1
    1 15 1
    4 16 NULL
    5 17 NULL
    3 18 1
    3 19 1
    2 20 1
    4 21 NULL
    1 22 2
    2 23 2
    3 24 2
    5 25 NULL
    3 26 3
    2 27 3
    6 28 NULL
    2 29 4
    3 30 4
    4 31 NULL
    1 32 3
    1 33 3
    2 34 3
    5 35 NULL
    2 36 2
    3 37 2
    4 38 NULL
    1 39 1
    2 40 1
    3 41 1
      

  7.   

    1楼数据结果  
    3 12 1
    2 13 1
    2 14 1
    1 15 1
    4 16 NULL
    5 17 NULL
    4 16 NULL
    4 16 NULL
    3 18 1
    3 19 1
    2 20 1
    4 21 NULL
    1 22 2
    2 23 2
    3 24 2
    5 25 NULL
    4 16 NULL
    4 16 NULL
    4 16 NULL
    3 26 1
    2 27 1
    6 28 NULL
    2 29 4
    3 30 4
    4 31 NULL
    1 32 3
    1 33 3
    2 34 3
    5 35 NULL
    2 36 2
    3 37 2
    4 38 NULL
    1 39 1
    2 40 1
    3 41 1
      兄弟  我这里查询分析器都可以执行 你让我怎么找 ????