现在有两个表,一个表是状态表,另一个表是数据表状态表:STable                                        数据表DTableSdatetime    status                                   Ddatetime    value                    
日期时间1    1                                        d日期时间1    1
日期时间2    1                                        d日期时间2    3
日期时间3    2                                        d日期时间3    6
日期时间4    2                                        d日期时间4    6
日期时间5    1                                        d日期时间5    9
日期时间6    1                                        d日期时间6    10
日期时间7    2                                        d日期时间7    11
日期时间8    2                                        d日期时间8    11
日期时间9    1                                        d日期时间9    15
日期时间10   1                                        d日期时间10   16
日期时间11   1                                        d日期时间11   18
日期时间12   2                                        d日期时间12   19
日期时间13   2                                        d日期时间13   19我要查询状态表中状态变化时间段内的数据表中数据相差
最后结果应该是这样的:Ddatetime    Maxvalue
d日期时间3    6                         //状态时间段为:日期时间1  ----  日期时间3
d日期时间7    5=11-6                    //状态时间段为:日期时间5  ----  日期时间7
d日期时间12   8=19-11                   //状态时间段为:日期时间9  ----  日期时间12请教大家,这个查询计算SQL语句怎么写?大家多多帮忙!谢谢!

解决方案 »

  1.   

    Sdatetime    status                                                   
    日期时间1    1                                        
    日期时间2    1                                       
    日期时间3    2                                       
    日期时间4    2                                      
    日期时间5    1                                       
    日期时间6    1                                      
    日期时间7    2                                      
    日期时间8    2                                       
    日期时间9    1                                       
    日期时间10   1                                       
    日期时间11   1                                       
    日期时间12   2                                      
    日期时间13   2 
    结果就如这样:
    开始时间            结束时间
    日期时间1           日期时间3
    日期时间5           日期时间7                      
    日期时间9           日期时间12
    这样明白吗
      

  2.   

    declare @stable table (sdatetime nvarchar(10),status int)
    insert into @stable select '日期时间1',1
           union all    select '日期时间2',1
           union all    select '日期时间3',2
           union all    select '日期时间4',2
           union all    select '日期时间5',1
           union all    select '日期时间6',1
           union all    select '日期时间7',2
           union all    select '日期时间8',2
           union all    select '日期时间9',1
           union all    select '日期时间10',1
           union all    select '日期时间11',1
           union all    select '日期时间12',2
           union all    select '日期时间13',2
    declare @Ddatetime table (sdatetime nvarchar(10),vlaue int)
    insert into @Ddatetime select '日期时间1',1
           union all    select '日期时间2',3
           union all    select '日期时间3',6
           union all    select '日期时间4',6
           union all    select '日期时间5',9
           union all    select '日期时间6',10
           union all    select '日期时间7',11
           union all    select '日期时间8',11
           union all    select '日期时间9',15
           union all    select '日期时间10',16
           union all    select '日期时间11',18
           union all    select '日期时间12',19
           union all    select '日期时间13',19
     ;with China as 
     (
      select b.*,ROW_NUMBER()over(order by b.vlaue) 序号 from (select * from @stable where status=2) a join    
                    (select * from @Ddatetime a where not exists (select 1 from @Ddatetime where a.vlaue=vlaue and sdatetime<a.sdatetime)) b 
                    on a.sdatetime=b.sdatetime
      ),China1 as
      (
       select sdatetime,vlaue as v,vlaue= vlaue - ISNULL((select vlaue from China where 序号=A.序号-1),0)  from china a   )
      select sdatetime,maxvlaue=vlaue from china1sdatetime  maxvlaue
    ---------- -----------
    日期时间3      6
    日期时间7      5
    日期时间12     8(3 行受影响)