用 Postgresql12 中的 previous/next 可用值替换具有空值或缺失值的第一行和最后一行

Replace first and last row having null values or missing values with previous/next available value in Postgresql12

我是 postgresql 的新手。 我想用 next/previous 可用值替换 table,T 的第一行和最后一行,它们具有空值或缺失值。此外,如果中间有缺失值,则应将其替换为以前可用的值。例如:

id   value   EXPECTED
1              1
2    1         1
3    2         2
4              2
5    3         3
6              3

我知道有很多类似的线程,但 none 似乎解决了这个问题,即开始和结束也有缺失值(包括中间行中的一些缺失)。还有一些概念,如 first_row ,分区依据,前 1(不适用于 postgres)作为新手很难掌握。

到目前为止,我已经提到了以下线程:value from previous row and Previous available value

有人可以指导我正确的方向来解决这个问题吗? 谢谢

不幸的是,Postgres 在 lead()lag() 上没有 ignore nulls 选项。在您的示例中,您只需要从下一行借用。所以:

select t.*,
       coalesce(value, lag(value) over (order by id), lead(value) over (order by id)) as expected
from t;

如果连续有多个 NULL,那么这就比较棘手了。一种解决方案是根据值开始或停止的时间来定义 "groups"。您可以使用值的累积计数来执行此操作——升序和降序:

select t.*,
       coalesce(value,
                max(value) over (partition by grp_before),
                max(value) over (partition by grp_after)
               ) as expected
from (select t.*,
             count(value) over (order by id asc) as grp_before,
             count(value) over (order by id desc) as grp_after
      from t
     ) t;

Here 是一个 db<>fiddle.