如何编写SQL筛选同时参与A/B测试Variant A和B的用户并保留B记录
解决A/B测试跨变体用户的记录筛选与删除问题
你之前用WHERE In_variant_A=1 AND In_variant_B=1没结果,核心原因是单条记录只会标记用户参与A或B其中一个变体,不会同时出现两个1,所以这个条件匹配不到任何行。下面是正确的实现步骤:
1. 筛选同时参与过Variant A和B的User_ID
可以通过分组聚合的方式,统计每个用户是否同时存在A和B的记录:
SELECT User_ID FROM 表X GROUP BY User_ID HAVING SUM(CASE WHEN In_variant_A = 1 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN In_variant_B = 1 THEN 1 ELSE 0 END) > 0;
或者用关联查询的方式,直接匹配同时有A和B记录的用户:
SELECT DISTINCT a.User_ID FROM 表X a INNER JOIN 表X b ON a.User_ID = b.User_ID WHERE a.In_variant_A = 1 AND b.In_variant_B = 1;
2. 删除目标用户的In_variant_A=1记录
基于上面筛选出的用户列表,删除他们对应的A变体记录:
通用写法(多数数据库支持)
DELETE FROM 表X WHERE User_ID IN ( SELECT User_ID FROM 表X GROUP BY User_ID HAVING SUM(CASE WHEN In_variant_A = 1 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN In_variant_B = 1 THEN 1 ELSE 0 END) > 0 ) AND In_variant_A = 1;
针对MySQL的JOIN写法(避免子查询引用同表的限制)
DELETE a FROM 表X a JOIN ( SELECT User_ID FROM 表X GROUP BY User_ID HAVING SUM(CASE WHEN In_variant_A = 1 THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN In_variant_B = 1 THEN 1 ELSE 0 END) > 0 ) b ON a.User_ID = b.User_ID WHERE a.In_variant_A = 1;
执行以上语句后,同时参与过A和B的用户只会保留他们的In_variant_B=1的记录,A变体记录会被删除。
内容的提问来源于stack exchange,提问作者Dominique van West
相关产品推荐
相关产品推荐

