You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:55:27