Snowflake SQL中按distinct customer_id聚合交易类型的实现咨询
Snowflake SQL 客户交易类型判定修正方案
原SQL问题
你的原有SQL存在两处核心错误:
- 未对
customer_id做聚合去重,会返回每个客户的所有原始交易记录,无法得到每个客户唯一的判定结果 - CASE判断仅针对单条记录的
type值,没有统计同一个客户下的所有type取值,无法识别同时存在a和b的场景
推荐修正方案(GROUP BY聚合实现,性能最优)
SELECT customer_id, CASE WHEN COUNT(DISTINCT type) = 1 THEN MAX(type) ELSE 'mixed' END AS type FROM CUSTOMERS GROUP BY customer_id ORDER BY customer_id;
逻辑说明
- 按
customer_id分组,天然实现每个客户只返回一条记录的去重需求 - 用
COUNT(DISTINCT type)统计每个客户的交易类型数量:- 数量为1时,说明该客户所有交易类型相同,用
MAX(type)/MIN(type)都可以拿到这个唯一的类型值 - 数量大于1时,说明同时存在a和b,直接返回
mixed即可
- 数量为1时,说明该客户所有交易类型相同,用
注意:如果你的表字段是大小写敏感定义(建表时用了双引号包裹字段名),把SQL里对应的字段名加上双引号即可,比如
"customer_id"、"type"。
可选方案(窗口函数实现)
如果你需要用窗口函数实现,也可以搭配DISTINCT去重完成需求:
SELECT DISTINCT customer_id, CASE WHEN COUNT(DISTINCT type) OVER (PARTITION BY customer_id) = 1 THEN type ELSE 'mixed' END AS type FROM CUSTOMERS ORDER BY customer_id;
内容的提问来源于stack exchange,提问作者314mip
相关产品推荐
相关产品推荐

