现在有两个表,一个表是状态表,另一个表是数据表状态表: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 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 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
这样明白吗
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 行受影响)