You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:02:35