O que você quer é
lag(ignore nulls)
. Aqui está uma maneira de fazer o que você quer, usando duas funções de janela. A primeira define o agrupamento para o NULL
valores e o segundo atribui o 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;
Você também pode fazer isso sem subconsultas usando arrays. Basicamente, pegue o último elemento sem 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;
Aqui é um db<>fiddle.