Jest to problem z lukami i wyspami, w którym każda wyspa kończy się rekordem „in”, a Ty chcesz zsumować wartości dla każdej wyspy.
Oto jedno podejście, które wykorzystuje liczbę kolejnych „in” do zdefiniowania grupy, a następnie sumę okien dla każdej grupy.
select timestamp,
case when val = 'out'
then val
else sum(val) over(partition by grp order by timestamp)
end as val,
typerow
from (
select t.*,
sum(case when typerow = 'in' then 1 else 0 end) over(order by timestamp desc) grp
from @table t
) t
order by timestamp
timestamp | val | typerow :---------------------- | --: | :------ 2018-06-03 13:30:00.000 | 6 | out 2018-06-03 14:10:00.000 | 8 | out 2018-06-03 14:30:00.000 | 17 | in 2018-06-03 15:00:00.000 | 9 | out 2018-06-03 15:30:00.000 | 4 | out 2018-06-03 16:00:00.000 | 2 | out 2018-06-03 17:05:00.000 | 23 | in 2018-06-03 17:30:00.000 | 0 | out 2018-06-03 18:15:00.000 | 7 | out 2018-06-03 18:30:00.000 | 8 | in 2018-06-03 19:00:00.000 | 5 | out