यह एक अंतराल और द्वीप समस्या है, जहां प्रत्येक द्वीप एक "इन" रिकॉर्ड के साथ समाप्त होता है, और आप प्रत्येक द्वीप में मानों का योग करना चाहते हैं।
यहां एक दृष्टिकोण है जो समूह को परिभाषित करने के लिए निम्नलिखित "इन" की संख्या का उपयोग करता है, और फिर प्रत्येक समूह पर एक विंडो योग का उपयोग करता है।
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