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

BigQuery中替换Type列0值为前序非零值的SQL实现求助

BigQuery 替换Type=0为最近非零值的SQL实现

我们需要处理BigQuery中的数据表,按date列升序排序后,将所有Type=0的数值替换为该行之前最近的非零Type值。

原始数据

行号dateType
101/12/174
202/12/170
303/12/174
404/12/170
505/12/170
606/12/170
707/12/170
808/12/174
909/12/175
1010/12/176
1111/12/170
1212/12/175
1313/12/170
1414/12/170
1515/12/175

期望输出

行号dateType
101/12/174
202/12/174
303/12/174
404/12/174
505/12/174
606/12/174
707/12/174
808/12/174
909/12/175
1010/12/176
1111/12/176
1212/12/175
1313/12/175
1414/12/175
1515/12/175

实现SQL语句

1. 查询验证语句

先通过查询确认处理结果是否符合预期:

WITH ranked_data AS (
  SELECT
    行号,
    date,
    Type,
    -- 给每个非零Type分组,后续用分组填充0值
    SUM(CASE WHEN Type != 0 THEN 1 ELSE 0 END) OVER (ORDER BY date ASC) AS group_id
  FROM
    `your-project.your-dataset.your-table`
)
SELECT
  行号,
  date,
  -- 提取分组内第一个非零Type值
  FIRST_VALUE(Type) OVER (PARTITION BY group_id ORDER BY date ASC) AS Type
FROM
  ranked_data
ORDER BY
  date ASC;

2. 表更新语句

如果需要直接更新原表,可使用MERGE语句(操作前建议备份数据,确保表支持DML操作):

MERGE INTO `your-project.your-dataset.your-table` AS target
USING (
  WITH ranked_data AS (
    SELECT
      行号,
      date,
      Type,
      SUM(CASE WHEN Type != 0 THEN 1 ELSE 0 END) OVER (ORDER BY date ASC) AS group_id
    FROM
      `your-project.your-dataset.your-table`
  ),
  processed_data AS (
    SELECT
      行号,
      FIRST_VALUE(Type) OVER (PARTITION BY group_id ORDER BY date ASC) AS new_Type
    FROM
      ranked_data
  )
  SELECT * FROM processed_data
) AS source
ON target.行号 = source.行号
WHEN MATCHED THEN
  UPDATE SET target.Type = source.new_Type;

核心逻辑说明

  • 用SUM(CASE...) OVER (ORDER BY date)创建分组:每遇到非零Type,分组ID递增,连续的0值会和之前最近的非零Type归为同一分组。
  • FIRST_VALUE(Type)提取分组内首个非零值,自动填充该分组内所有行的Type字段。
  • 替换语句中的your-project.your-dataset.your-table为实际的项目、数据集和表名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:35:37