SQL中类似Pandas df.ffill()的等效实现(PostgreSQL)
PostgreSQL 实现类似 Pandas
ffill() 的简便方法 问题场景
原始数据表:
day0, measurement0 day1, null day2, measurement1 day3, null day4, null
期望得到的填充后结果:
day0, measurement0 day1, measurement0 day2, measurement1 day3, measurement1 day4, measurement1
需要找到PostgreSQL中类似Pandas df.ffill()(向前填充)的简便实现,避免复杂难维护的方案。
简便实现方案
适用于PostgreSQL 11+版本的写法
可以结合LAST_VALUE()窗口函数和IGNORE NULLS参数实现,写法简洁易维护:
SELECT day, LAST_VALUE(measurement) OVER ( ORDER BY day ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW IGNORE NULLS ) AS filled_measurement FROM measurements;
逻辑说明
LAST_VALUE(measurement):提取窗口范围内最后一个有效的measurement值ORDER BY day:按日期顺序排序,保证向前填充的顺序正确ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:限定窗口范围为从数据集第一行到当前行,确保只取当前行之前的最近非空值IGNORE NULLS:忽略窗口内的空值,直接定位到最近的非空记录,这是实现向前填充的核心
兼容低版本PostgreSQL的写法
如果你的PostgreSQL版本低于11,可利用MAX()函数忽略空值的特性实现同样效果:
SELECT day, MAX(measurement) OVER ( ORDER BY day ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS filled_measurement FROM measurements;
这个写法通过窗口范围内取最大非空值(按日期排序后,最大的非空值就是最近的前置有效值),达到向前填充的目的。
内容的提问来源于stack exchange,提问作者iirekm
相关产品推荐
相关产品推荐

