Je eerste versie zou moeten werken, met een kleine aanpassing:
select A.*,
coalesce(V1, lag(V1 ignore nulls) over (order by data)) V2
from Tab1 A;
De tweak is om de partition by v1 van de lag() . De coalesce() is gewoon mijn voorkeur voor eenvoudigere uitdrukkingen.
Dezelfde aanpassing zou ook moeten werken voor de tweede versie.
Uw versie werkt niet omdat de lag() waarde moet van dezelfde partitie komen (of null zijn) ). Wanneer u partition by v1 . heeft , zorgt u er feitelijk voor dat v1 heeft dezelfde waarde als in de huidige rij.