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

Redshift SQL:按用户分区填充最后一个非空值的实现方法

填充用户购买记录中最后一个非空的purchase_amount值

要实现将null的purchase_amount替换为用户最近一次的非空购买金额,你需要的是**向前填充(forward fill)**逻辑,LEAD函数是向后取数,方向不对,自然无法解决问题。以下是不同SQL环境下的可行方案:

方案1:支持IGNORE NULLS的数据库(PostgreSQL 11+、BigQuery、Oracle等)

直接使用LAST_VALUE函数并搭配IGNORE NULLS参数,按用户分区、日期排序,取当前行及之前所有行中最后一个非空的购买金额:

SELECT
  date,
  user_id,
  LAST_VALUE(purchase_amount IGNORE NULLS) OVER (
    PARTITION BY user_id
    ORDER BY date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS purchase_amount
FROM your_table;

方案2:不支持IGNORE NULLS的数据库(MySQL 8.0及以下、老版本SQL Server等)

通过生成分组标识的方式实现向前填充:

  1. 先为每个用户的非空购买金额生成递增的分组ID,遇到非空值时分组ID加1;
  2. 再按用户和分组ID取组内的最大购买金额(即该分组对应的非空值)。
WITH grouped_data AS (
  SELECT
    date,
    user_id,
    purchase_amount,
    -- 生成分组标识:每遇到非空金额则分组+1
    SUM(CASE WHEN purchase_amount IS NOT NULL THEN 1 ELSE 0 END) OVER (
      PARTITION BY user_id
      ORDER BY date
      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS value_group
  FROM your_table
)
SELECT
  date,
  user_id,
  MAX(purchase_amount) OVER (PARTITION BY user_id, value_group) AS purchase_amount
FROM grouped_data;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:06:43