PostgreSQL按分组填充空值为组内前序非空值的实现方法
PostgreSQL分组填充NULL为组内前序非空值解决方案
你需要实现的是分组后按日期排序,将NULL值填充为组内之前出现的最后一个非空值,用PostgreSQL的窗口函数可以轻松解决这个问题,具体实现如下:
解决方案SQL
SELECT "Date", "Group", LAST_VALUE("value") OVER ( PARTITION BY "Group" ORDER BY "Date" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW IGNORE NULLS ) AS "value" FROM X;
代码说明
PARTITION BY "Group":按Group字段将数据分组,每个组独立处理填充逻辑ORDER BY "Date":确保组内数据按日期先后顺序排列,保证填充的是之前出现的非空值LAST_VALUE("value") ... IGNORE NULLS:忽略NULL值,提取当前行及之前范围内最后一个非空的value值ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:限定窗口范围为从组的第一行到当前行,避免提前引用后续行的值
验证示例
输入表X:
| Date | Group | value |
|---|---|---|
| 1/1/2023 | A | NULL |
| 2/1/2023 | A | Kevin |
| 3/1/2023 | A | NULL |
| 4/1/2023 | A | Tom |
| 5/1/2023 | A | NULL |
| 6/1/2023 | A | NULL |
| 1/1/2023 | B | Sara |
| 2/1/2023 | B | NULL |
执行上述SQL后,得到的输出与你期望的一致:
| Date | Group | value |
|---|---|---|
| 1/1/2023 | A | NULL |
| 2/1/2023 | A | Kevin |
| 3/1/2023 | A | Kevin |
| 4/1/2023 | A | Tom |
| 5/1/2023 | A | Tom |
| 6/1/2023 | A | Tom |
| 1/1/2023 | B | Sara |
| 2/1/2023 | B | Sara |
注意:
Group是PostgreSQL的保留关键字,所以在SQL中必须用双引号"Group"包裹,否则会触发语法错误。
内容的提问来源于stack exchange,提问作者Hoàng Phạm Kim
相关产品推荐
相关产品推荐

