This will work on Snowflake (credit to Darren Gardner):
create temp table ss (id int, val int);
insert into ss (id,val) select 1, 3;
insert into ss (id,val) select 2, null;
insert into ss (id,val) select 3, 5;
insert into ss (id,val) select 4, null;
insert into ss (id,val) select 5, null;
insert into ss (id,val) select 6, 2;
select *
,last_value(val ignore nulls) over
(order by id rows between unbounded preceding and current row) as val2
from ss;