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

如何用同ID最近非0值填充连续0值?LAG函数失效求助

用最近非零值填充连续零值的SQL解决方案

原始数据

id日期value
101/01/20225
102/02/20220
103/01/20220
104/02/202210
201/04/20225
202/04/20223
203/04/20220
204/04/202210

需求说明

按id分组,将value列中值为0的行,替换为该id下最近的非0值。此前尝试使用LAG(1)函数,但遇到连续多个0值时无法生效(如id=1的连续两行0)。

期望结果

id日期value
101/01/20225
102/02/20225
103/01/20225
104/02/202210
201/04/20225
202/04/20223
203/04/20223
204/04/202210

无效尝试代码

SELECT *, LAG(VALUE) OVER (ORDER BY VALUE, DATE ASC) FROM TABLE
ORDER BY VALUE, DATE ASC

解决方案

方法1:使用LAST_VALUE + IGNORE NULLS

直接在窗口函数中取当前行及之前最近的非零值,忽略空值:

SELECT 
    id,
    日期,
    LAST_VALUE(CASE WHEN value != 0 THEN value END IGNORE NULLS) 
        OVER (PARTITION BY id ORDER BY 日期 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS filled_value
FROM 你的表名
ORDER BY id, 日期;

方法2:分组标识法

先通过累加非零值计数生成分组ID,再取组内非零值填充:

WITH grouped_data AS (
    SELECT 
        *,
        SUM(CASE WHEN value != 0 THEN 1 ELSE 0 END) 
            OVER (PARTITION BY id ORDER BY 日期) AS group_id
    FROM 你的表名
)
SELECT 
    id,
    日期,
    MAX(value) OVER (PARTITION BY id, group_id) AS filled_value
FROM grouped_data
ORDER BY id, 日期;

说明

  • 两种方法均按id分区、按日期排序,确保只在同一id范围内找最近非零值。
  • 方法1适合支持IGNORE NULLS的SQL方言(如PostgreSQL、BigQuery等);方法2兼容性更强,几乎所有主流SQL引擎都支持。

内容的提问来源于stack exchange,提问作者j5934

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:50:36