如何用CASE WHEN和PARTITION BY判断客户订单类型分类
如何用最简SQL判断客户的订单类型分类
输入数据
| Cust ID | Order Type |
|---|---|
| Cust 1 | Online |
| Cust 2 | In-Store |
| Cust 2 | Online |
| Cust 3 | In-Store |
期望输出
| Cust ID | New_Order Type |
|---|---|
| Cust 1 | Online only |
| Cust 2 | Both |
| Cust 3 | In-Store only |
最简SQL方案
你之前用开窗函数的思路绕了弯路,直接通过分组聚合+条件判断就能实现需求,而且结果天然是每个客户一行,不会出现NULL列:
通用版本(适配PostgreSQL、SQL Server、MySQL等多数数据库)
SELECT "Cust ID", CASE WHEN COUNT(DISTINCT "Order Type") = 2 THEN 'Both' WHEN MAX("Order Type") = 'Online' THEN 'Online only' ELSE 'In-Store only' END AS "New_Order Type" FROM your_table_name GROUP BY "Cust ID";
思路说明
- 按客户ID分组,先用
COUNT(DISTINCT "Order Type")判断该客户是否存在两种订单类型,是的话直接返回Both - 对于只有单一订单类型的客户,用
MAX(或MIN,因为分组后只有唯一值)获取该类型,再映射到对应的“only”分类 - 整个逻辑无需开窗函数,分组后直接处理,代码简洁高效
内容的提问来源于stack exchange,提问作者Data_Marketing_
相关产品推荐
相关产品推荐

