SQL技术需求:对重复ID去重并生成活动状态布尔列
需求与SQL实现方案
需求说明
现有数据存在ID重复但对应Activity不同的记录,需编写SQL实现以下效果:
- 返回所有去重后的ID
- 新增
Email、Appointment、Phone call三列,当该ID对应的Activity与列名匹配时,列值为True,否则为False
现有数据
| ID | Activity |
|---|---|
| 101 | |
| 101 | Appointment |
| 102 | Campaign |
| 103 | Phone call |
| 104 | Appointment |
已编写的部分SQL语句
SELECT id, MAX(CASE WHEN activity='Phone Call' THEN TRUE ELSE FALSE END) AS PhoneCall, MAX(CASE WHEN activity='Appointment' THEN TRUE ELSE FALSE END) AS Appointment, MAX(CASE WHEN activity='Email' THEN TRUE ELSE FALSE END) AS Email
完整修正后的SQL语句
原SQL存在两处问题:一是缺少GROUP BY id(使用聚合函数MAX必须按ID分组),二是Phone Call的大小写与数据中的Phone call不匹配,会导致匹配失败。以下是修正后的完整语句:
SELECT id, MAX(CASE WHEN activity='Email' THEN TRUE ELSE FALSE END) AS Email, MAX(CASE WHEN activity='Appointment' THEN TRUE ELSE FALSE END) AS Appointment, MAX(CASE WHEN activity='Phone call' THEN TRUE ELSE FALSE END) AS `Phone call` FROM your_table_name GROUP BY id;
注意:将
your_table_name替换为实际表名;Phone call列名包含空格,需用反引号(MySQL)或方括号(SQL Server)包裹,不同数据库语法略有差异。
期望执行结果
| ID | Appointment | Phone call | |
|---|---|---|---|
| 101 | True | True | False |
| 102 | False | False | False |
| 103 | False | False | True |
| 104 | False | True | False |
内容的提问来源于stack exchange,提问作者Bekhzod Abdullaev
相关产品推荐
相关产品推荐

