用 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 null
s 选项。在您的示例中,您只需要从下一行借用。所以:
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.
我是 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 null
s 选项。在您的示例中,您只需要从下一行借用。所以:
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.