【问题标题】:Replace first and last row having null values or missing values with previous/next available value in Postgresql12将具有空值或缺失值的第一行和最后一行替换为 Postgresql12 中的上一个/下一个可用值
【发布时间】:2020-05-12 21:58:28
【问题描述】:
我是 postgresql 的新手。
我想用下一个/上一个可用值替换我的第一行和最后一行表 T,它具有空值或缺失值。此外,如果中间有缺失值,则应将其替换为以前的可用值。例如:
id value EXPECTED
1 1
2 1 1
3 2 2
4 2
5 3 3
6 3
我知道有许多类似的线程,但似乎没有一个解决这个问题,即 start 和 end 也有缺失值(包括中间行中的一些缺失)。还有一些概念,例如 first_row 、partition by、top 1(不适用于 postgres)作为新手很难掌握。
到目前为止,我已经提到了以下线程:value from previous row 和 Previous available value
有人可以指导我正确的方向来解决这个问题吗?
谢谢
【问题讨论】:
标签:
sql
database
postgresql
rdbms
【解决方案1】:
不幸的是,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,那么这会比较棘手。一种解决方案是根据值开始或停止的时间来定义“组”。您可以使用值的累积计数来执行此操作 - 升序和降序:
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 是一个 dbfiddle。