Sua primeira versão deve funcionar, com um pequeno ajuste:
select A.*,
coalesce(V1, lag(V1 ignore nulls) over (order by data)) V2
from Tab1 A;
O ajuste é remover a
partition by v1 do lag() . A coalesce() é apenas minha preferência por expressões mais simples. O mesmo ajuste deve funcionar para a segunda versão também.
Sua versão não funciona porque o
lag() o valor deve vir da mesma partição (ou ser null ). Quando você tem partition by v1 , você está realmente garantindo que v1 tem o mesmo valor que na linha atual.