Lo que quieres es lag(ignore nulls)
. Aquí hay una forma de hacer lo que quiere, usando dos funciones de ventana. El primero define la agrupación para el NULL
valores y el segundo asigna el valor:
select idx, value, coalesce(value, max(value) over (partition by grp))
from (select b.*, count(value) over (order by idx) as grp
from base b
) b
order by idx;
También puede hacer esto sin subconsultas mediante el uso de matrices. Básicamente, toma el último elemento sin contar NULL
s:
select idx, value,
(array_remove(array_agg(value) over (order by idx), null))[count(value) over (order by idx)]
from base b
order by idx;
Aquí es un db<>violín.