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 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  
 
----从上至下更新 
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     
when S_DATA between 4 and 6 and @data = 888 then @flag     
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.   

    --在你的代碼的基礎上這麼修改下可以得到你要的結果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 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  
     
    ----从上至下更新 
    declare @data int,@flag int 
    select @flag = 1, @data = 0UPDATE @t SET  
    @flag = (Case When (@data Between 4 And 6) And (S_DATA Not Between 4 And 6) Then @flag + 1 Else @flag End), 
    S_ID = (Case When (S_DATA Between 4 And 6) Then Null Else @flag End), 
    @data = S_DATA----生成用于从下至上更新的临时表 
    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
      

  2.   

    麻烦你把相同标志位的数据求平均,并且保留当前标志位最大的S_TIME。而无效数据段(等于4或5)删除例如这组数据的结果是:(3+2+2+1)/4     15      1-------(等于4,5的删除了)(3+3+2)/3       20      2-------(等于4,5的删除了)(1+2+3)/3       24      3........
    朋友麻烦你,我在线等你