如何筛选status列中值3出现不超过一次的user_id?
正确SQL实现方案:筛选status=3出现次数≤1的user_id
原SQL的问题分析
原SQL的窗口函数partition by status,user_id是按用户+状态分组统计次数,统计的是每个用户下单个状态的出现次数,而非每个用户的status=3总次数。后续筛选sc<=1会把所有用户中出现次数≤1的状态记录都查出来(比如1010的status=1记录sc=1会被选中),完全不符合“整个用户的status=3出现次数≤1”的需求。
方法一:分组聚合(推荐)
直接按user_id分组,统计每个用户的status=3出现次数,再通过HAVING筛选结果:
SELECT user_id FROM `user` GROUP BY user_id HAVING SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) <= 1
逻辑说明:
SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END):对每个user_id,精准统计status等于3的行数。HAVING子句直接过滤出统计结果≤1的user_id。
方法二:窗口函数实现
按user_id分区计算每个用户的status=3总次数,再筛选并去重:
SELECT DISTINCT user_id FROM ( SELECT user_id, SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) OVER (PARTITION BY user_id) AS cnt_3 FROM `user` ) t WHERE cnt_3 <= 1
逻辑说明:
- 内层窗口函数
PARTITION BY user_id按用户分区,计算每个用户的status=3总次数cnt_3。 - 外层筛选
cnt_3 <=1,并用DISTINCT去重,得到唯一的符合条件的user_id。
内容的提问来源于stack exchange,提问作者Irfan
相关产品推荐
相关产品推荐

