SQL查询:如何筛选始终购买同一品牌同一款产品的忠诚客户
筛选客户消费表中忠诚客户的SQL实现
前提说明
现有客户消费表Customer Table,包含三个字段:
Customer_id:客户IDProduct:产品名称Brand:品牌名称
样例数据如下:
| Customer_id | Product | Brand |
|---|---|---|
| 123 | Chocobix | Cadbury |
| 235 | Chocobix | Cadbury |
| 123 | 5 star | Cadbury |
| 456 | Kikat | Nestle |
| 235 | Chocobix | Cadbury |
| 456 | Chocobix | Cadbury |
| 432 | Milky bar | Nestle |
筛选规则
忠诚客户判定标准:同一客户购买的所有产品,每个品牌下仅对应唯一一款产品,不存在同一品牌下购买多款不同产品的记录。根据样例数据,符合要求的客户为235、432。
实现SQL语句
核心思路是先按客户+品牌分组,统计每组的去重产品数量,再按客户聚合,确保所有品牌分组的去重产品数都为1即可:
SELECT Customer_id FROM ( SELECT Customer_id, Brand, COUNT(DISTINCT Product) AS distinct_product_count FROM `Customer Table` GROUP BY Customer_id, Brand ) AS customer_brand_product_cnt GROUP BY Customer_id -- 确保该客户下所有品牌对应的不同产品数量都为1 HAVING MAX(distinct_product_count) = 1 AND MIN(distinct_product_count) = 1;
如果你的数据库支持ALL语法,也可以简化写法:
SELECT DISTINCT Customer_id FROM `Customer Table` t1 WHERE 1 = ALL ( SELECT COUNT(DISTINCT Product) FROM `Customer Table` t2 WHERE t2.Customer_id = t1.Customer_id GROUP BY t2.Brand );
结果验证
以上SQL在样例数据上运行的输出结果为:
| Customer_id |
|---|
| 235 |
| 432 |
完全符合需求。
内容的提问来源于stack exchange,提问作者deepak
相关产品推荐
相关产品推荐

