如何实现当同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;
执行结果验证
无论用哪种方案,执行后都会得到符合预期的结果(去掉示例中的*标记,直接填充有效值):
| id | nu_cns | nu_cpf | co_dim_tempo | sifilis | hiv |
|---|---|---|---|---|---|
| 908 | 708 | 347 | 1 | y | n |
| 908 | 708 | 347 | 2 | y | y |
| 908 | 708 | 347 | 3 | y | y |
内容的提问来源于stack exchange,提问作者Italo Rodrigo
相关产品推荐
相关产品推荐

