PostgreSQL的ignore NULLs,前沿补值的另类实现

今天在对数据进行补充时,我有这么一个表单数据,其中病人的每日体重数据是有所缺失的,我需要利用最近一天的非空值进行填充。

piddayweight
10001147
100012(null)
10001350
10002147
100022(null)
100023(null)
10002350

我查询到的SQL代码虽然提供了一个解决思路
Oracle解决方法:都是利用last_value或者lag,然后对非空值进行排序,其中需要利用到psql很多没有的语法——

 nvl(last_value(case when col2 > 0 then col2 end) ignore nulls over (order by original_order$ rows between unbounded preceding and current row), col2) as col2

根据PostgreSQL的官方手册说明:这种方法寄了,不提供ignore nulls的方法。
在这里插入图片描述
下面的思路为:利用count的效果,进行聚合标签的标定
当count(1),count(1, NULL)与count(1, NULL,NULL)结果都是1,count(1, NULL, NULL, 10)的结果是2,则此时,前三行会与1对应的形成一个聚合组,第四行单独形成聚合组。

piddayweightcount
100011471
100012(null)1
100013502
100021471
100022(null)1
100023(null)1
100023502

此时根据count和pid聚合对空值进行填充即可。

--前沿补值
select pid, weight, coalesce(weight, max(weight) over (partition by pid, day))
from (select b.*, count(weight) over (partition by pid order by day) as grp
      from base b
     ) b
order by idx;
--后沿补值
select pid, weight, coalesce(weight, max(weight) over (partition by pid, day))
from (select b.*, count(weight) over (partition by pid order by day desc) as grp
      from base b
     ) b
order by idx;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值