Решение ниже зависит от первого ненулевого значения для end_value, отсортированного по дате - т.е. оно игнорирует остальные значения.
with t (sid, dt,change,end_value) as (
select 1 , to_date('03-JAN-20', 'dd-MON-rr') , -9 , null from dual union all
select 2 , to_date('04-JAN-20', 'dd-MON-rr') , 12 , null from dual union all
select 3 , to_date('05-JAN-20', 'dd-MON-rr') , -43 , 523 from dual union all
select 4 , to_date('06-JAN-20', 'dd-MON-rr') , 0 , null from dual union all
select 5 , to_date('07-JAN-20', 'dd-MON-rr') , 5 , null from dual union all
select 6 , to_date('08-JAN-20', 'dd-MON-rr') , 10 , null from dual union all
select 7 , to_date('09-JAN-20', 'dd-MON-rr') , 3 , 505 from dual union all
select 8 , to_date('10-JAN-20', 'dd-MON-rr') , 4 , null from dual union all
select 9 , to_date('11-JAN-20', 'dd-MON-rr') , -3 , null from dual union all
select 10, to_date('12-JAN-20', 'dd-MON-rr') , 1 , 503 from dual union all
select 11, to_date('13-JAN-20', 'dd-MON-rr') , -6 , null from dual
)
select sid, dt, change, end_value, nvl(yy,yyy) rslt from (
select a.*
, sum(case when dt = xx then end_value when dt > xx then -change end) over ( order by dt) yy
, sum(case when dt = xx then end_value when dt < xx then ld end) over ( order by dt desc) yyy
from (
select t.*
, min(dt) keep (dense_rank first order by nvl2(end_value,0,1)) over () xx
, lead(change) over (order by dt) ld
from t
) a
) b
order by dt