如何针对指定场景合并表格行并处理业务代码缺失问题?
Solution to Clean Customer Business Data
看起来你需要整理客户的业务数据,按照给定的规则清理重复行并补全缺失的业务标记。这里是一个适配需求的解决方案,用SQL实现就能快速处理你的表格数据:
Original Input Table
| CustId | Name | Age | Gender | Business | Code |
|---|---|---|---|---|---|
| 1 | John | 24 | Male | Automobiles | 1 |
| 2 | Peter | 30 | Male | Space | 3 |
| 2 | Peter | 30 | Male | IT | null |
| 3 | Kris | 48 | Female | Infra | null |
SQL Implementation
我们可以用窗口函数标记每个客户的有效Code状态,再据此过滤和修改数据:
WITH customer_code_check AS ( SELECT *, -- 标记该客户是否存在非空的Code值 MAX(CASE WHEN Code IS NOT NULL THEN 1 ELSE 0 END) OVER (PARTITION BY CustId) AS has_valid_code FROM your_table_name ) SELECT CustId, Name, Age, Gender, CASE WHEN has_valid_code = 1 AND Code IS NOT NULL THEN Business WHEN has_valid_code = 0 THEN 'CodeNotAvailable' END AS Business, Code FROM customer_code_check -- 过滤掉有有效Code但当前行Code为空的冗余记录 WHERE has_valid_code = 0 OR Code IS NOT NULL;
Processed Output Table
| CustId | Name | Age | Gender | Business | Code |
|---|---|---|---|---|---|
| 1 | John | 24 | Male | Automobiles | 1 |
| 2 | Peter | 30 | Male | Space | 3 |
| 3 | Kris | 48 | Female | CodeNotAvailable | null |
Logic Explanation
- 标记客户Code状态:通过窗口函数
MAX() OVER (PARTITION BY CustId),给每个客户打上是否有有效Code的标记(has_valid_code=1表示存在非空Code,0表示所有行Code都是null)。 - 数据过滤与修改:
- 对于有有效Code的客户,只保留Code非空的行,直接沿用原Business值;
- 对于没有任何有效Code的客户,将Business字段替换为
CodeNotAvailable,保留原Code的null值;
- 移除冗余行:过滤掉那些所属客户有有效Code,但当前行Code为空的记录(比如Peter的IT行)。
内容的提问来源于stack exchange,提问作者Vikram Babu Nagineni
相关产品推荐
相关产品推荐

