PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL last_value ignora nulos


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.