sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL last_value ignorar nulos

Lo que quieres es lag(ignore nulls) . Aquí hay una forma de hacer lo que quiere, usando dos funciones de ventana. El primero define la agrupación para el NULL valores y el segundo asigna el 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;

También puede hacer esto sin subconsultas mediante el uso de matrices. Básicamente, toma el último elemento sin 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;

Aquí es un db<>violín.