Teradata
select s.i
,first_value (s.val) over
(
partition by s.depth
order by s.i
reset when s.op = 'I'
) as top_of_stack_val
from (select s.i
,s.val
,s.op
,sum (case s.op when 'I' then 1 else -1 end) over
(
order by s.i
rows unbounded preceding
) as depth
from stack_trace s
)
s
order by i
;