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

如何筛选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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:30:52