То, что вы хотите, это lag(ignore nulls)
.Вот один из способов сделать то, что вы хотите, используя две оконные функции.Первый определяет группировку для значений NULL
, а второй - значение:
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;
Вы также можете сделать это без подзапросов, используя массивы.В общем, возьмем последний элемент, не считая NULL
с:
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;
Здесь - это скрипта db <>.