SQL实现查询仅订阅A服务的客户ID并生成单列临时表
仅订阅A类服务的Bucket1客户ID临时表实现方案
核心判定规则
Bucket1客户需要同时满足两个条件,规则不依赖硬编码全量订阅类型,适配实际场景下订阅类型动态增减的需求:
- 客户存在A类服务的有效订阅记录
- 客户不存在任何A类之外的其他服务订阅记录
可直接执行的SQL代码
以下写法兼容MySQL、PostgreSQL、SQL Server等绝大多数主流关系型数据库,执行后会直接生成仅存储Bucket1客户ID的单列临时表:
-- 创建Bucket1客户临时表,仅保留ID字段 CREATE TEMPORARY TABLE temp_bucket1 AS SELECT ID FROM table1 GROUP BY ID HAVING -- 校验当前客户已订阅A类服务 SUM(CASE WHEN Subscription = 'A' THEN 1 ELSE 0 END) > 0 -- 校验当前客户无任何非A类的其他订阅 AND SUM(CASE WHEN Subscription <> 'A' THEN 1 ELSE 0 END) = 0;
写法优势
- 不需要提前枚举所有可能的订阅类型,后续新增/调整订阅类型不需要修改SQL逻辑
- 兼容客户存在多条重复A类订阅记录的场景,不会出现漏判,相比常见的
HAVING COUNT(*) = 1 AND Subscription = 'A'写法鲁棒性更强,无需提前对重复订阅数据做去重处理
样例数据校验
针对给出的测试数据执行上述代码,返回结果完全符合预期:
- 102:仅订阅A类服务,被保留在临时表中
- 101:同时订阅A/B/C三类服务,存在非A类订阅被过滤
- 103:同时订阅A/B两类服务,存在非A类订阅被过滤
- 104:仅订阅D类服务,无A类订阅被过滤
如果需要获取所有订阅了A类服务的Bucket2客户集合,只需要删除第二个HAVING判断条件即可,返回结果为101、102、103。
内容的提问来源于stack exchange,提问作者EZ72
相关产品推荐
相关产品推荐

