To czego chcesz to lag(ignore nulls)
. Oto jeden ze sposobów na zrobienie tego, co chcesz, używając dwóch funkcji okna. Pierwszy definiuje grupowanie dla NULL
wartości, a drugi przypisuje wartość:
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;
Możesz to również zrobić bez podzapytań, używając tablic. Zasadniczo weź ostatni element nie liczący 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;
Tutaj to db<>skrzypce.