SQL技术求助:如何将同一customer_key的多响应记录合并为单行
问题描述
我正在基于其他数据源创建新表,用来存储与customer_key对应的客户响应数据。同一customer_key会根据不同响应类型(比如消息被打开或点击)生成多条独立记录。现在我的SQL语句处理同时有打开和点击响应的客户时,会生成两行结果,但我希望合并成一行,清晰展示该客户是否打开(Opened)和点击(Clicked)的状态。
Response_table数据
| campaign_key | customer_key | response_code |
|---|---|---|
| 42d28dc8 | 111 | 10205 |
| 42d28dc8 | 111 | 11205 |
| 42d28dc8 | 111 | 10204 |
尝试的SQL代码
SELECT DISTINCT(customer_key) ,(CASE WHEN response_code IN ('10204','11204') THEN 1 ELSE 0 END) AS OPENED ,(CASE WHEN response_code IN ('10205','11205') THEN 1 ELSE 0 END) AS CLICKED FROM Response_table WHERE campaign_key = '42d28dc8' AND customer_ref_key = '111'
期望结果
| customer_key | Opened | Clicked |
|---|---|---|
| 111 | 1 | 1 |
实际得到的结果
| customer_key | Opened | Clicked |
|---|---|---|
| 111 | 1 | 0 |
| 111 | 0 | 1 |
解决方案
问题根源是没有对customer_key做分组聚合,DISTINCT仅能去重,无法合并不同行的状态值。需要用聚合函数MAX()提取每个客户的响应状态——只要该客户有任意一条记录匹配响应类型,MAX()就会返回1,否则为0。
修改后的SQL代码:
SELECT customer_key, MAX(CASE WHEN response_code IN ('10204','11204') THEN 1 ELSE 0 END) AS Opened, MAX(CASE WHEN response_code IN ('10205','11205') THEN 1 ELSE 0 END) AS Clicked FROM Response_table WHERE campaign_key = '42d28dc8' AND customer_key = '111' -- 修正原代码字段名笔误,原写为customer_ref_key GROUP BY customer_key;
代码说明
GROUP BY customer_key将同一客户的所有记录归为一组MAX()函数在分组内取CASE表达式的最大值,确保只要存在对应响应就显示1- 修正了原代码中的字段名错误,否则会导致查询结果为空
内容的提问来源于stack exchange,提问作者Cmags
相关产品推荐
相关产品推荐

