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

如何实现当同ID下nu_cns、nu_cpf字段为空时填充对应非空值

分组填充缺失字段值的SQL解决方案

刚看到你的需求,这是个很常见的分组补全缺失值的场景——按id分组后,把同组内nu_cns/nu_cpf的非空有效值,填充到对应字段的空值位置。下面分不同SQL环境给出具体实现方案:

核心思路

利用分组聚合或窗口函数,先获取每个id组内nu_cns和nu_cpf的唯一非空值,再用COALESCE()函数将空值替换为该有效值。


方案1:支持窗口函数的数据库(PostgreSQL/MySQL 8+/SQL Server)

窗口函数是最简洁的实现方式,无需额外关联子查询:

SELECT
    id,
    -- 填充nu_cns的空值:用同id组内的非空值替换
    COALESCE(nu_cns, MAX(nu_cns) OVER (PARTITION BY id)) AS nu_cns,
    -- 填充nu_cpf的空值:用同id组内的非空值替换
    COALESCE(nu_cpf, MAX(nu_cpf) OVER (PARTITION BY id)) AS nu_cpf,
    co_dim_tempo,
    sifilis,
    hiv
FROM your_table_name;

代码解释:

  • PARTITION BY id:限定仅在同一id的分组内计算
  • MAX(nu_cns) OVER (...):因为同组内nu_cns的非空值唯一,取最大值就能得到该组的有效值
  • COALESCE(a, b):如果a为null则返回b,否则保留a本身

方案2:MySQL 5.x(不支持窗口函数)

如果你的MySQL版本较低,用子查询分组关联的方式实现:

SELECT
    t.id,
    COALESCE(t.nu_cns, g.group_cns) AS nu_cns,
    COALESCE(t.nu_cpf, g.group_cpf) AS nu_cpf,
    t.co_dim_tempo,
    t.sifilis,
    t.hiv
FROM your_table_name t
-- 关联子查询,获取每个id组的非空有效值
JOIN (
    SELECT
        id,
        MAX(nu_cns) AS group_cns,
        MAX(nu_cpf) AS group_cpf
    FROM your_table_name
    GROUP BY id
) g ON t.id = g.id;

执行结果验证

无论用哪种方案,执行后都会得到符合预期的结果(去掉示例中的*标记,直接填充有效值):

idnu_cnsnu_cpfco_dim_temposifilishiv
9087083471yn
9087083472yy
9087083473yy

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:03:09