如何用对应客户组的customerID替换NULL值,无数据则留空?
问题描述
我有一张包含contractID、customergroup、customerID三列的表,部分customerID数据缺失(为NULL)。需要将这些NULL值替换为对应customergroup中已存在的customerID;若该客户组无可用的customerID,则保持为空。
原始数据
| contractID | customergroup | customerID |
|---|---|---|
| 20135 | B2021 | 5521 |
| 20136 | B2021 | NULL |
| 20137 | B2022 | NULL |
| 20138 | B2022 | 5523 |
| 20139 | B2022 | 5523 |
| 20140 | B2023 | NULL |
预期结果
| contractID | customergroup | customerID |
|---|---|---|
| 20135 | B2021 | 5521 |
| 20136 | B2021 | 5521 |
| 20137 | B2022 | 5523 |
| 20138 | B2022 | 5523 |
| 20139 | B2022 | 5523 |
| 20140 | B2023 |
解决方案
通用SQL(支持窗口函数的数据库:MySQL 8+、PostgreSQL、SQL Server等)
利用窗口函数按客户分组提取非空customerID,再结合COALESCE替换原字段的NULL值:
SELECT contractID, customergroup, COALESCE(customerID, MAX(customerID) OVER (PARTITION BY customergroup)) AS customerID FROM your_table_name;
说明
MAX(customerID) OVER (PARTITION BY customergroup):按客户组分组,自动忽略NULL值,返回组内存在的customerID;若组内全为NULL,则返回NULLCOALESCE:优先使用原customerID的值,原字段为NULL时,用分组得到的非空值替换;若分组结果也为NULL,则最终返回空值
兼容旧版MySQL(无窗口函数)
对于不支持窗口函数的旧版本数据库,可通过子查询关联实现:
SELECT t.contractID, t.customergroup, COALESCE(t.customerID, g.group_customerID) AS customerID FROM your_table_name t LEFT JOIN ( SELECT customergroup, MAX(customerID) AS group_customerID FROM your_table_name GROUP BY customergroup ) g ON t.customergroup = g.customergroup;
内容的提问来源于stack exchange,提问作者Antonkonow
相关产品推荐
相关产品推荐

