Това, което искате, е 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
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;
Тук е db<>цигулка.