MySQL按用户统计满足访问量条件的时段数(含SQL问题)
解决用户访问时段统计的SQL问题
嘿,我看了你写的SQL,问题出在CASE语句的语法错误和缺少用户分组上,咱们一步步修正它,实现你要的三个统计指标。
先说说你原有SQL的问题
- 你把多个CASE语句直接连在一起写,这不符合SQL语法规范,每个判断逻辑都需要是独立的
CASE WHEN ... THEN 1 ELSE 0 END,再把这些值相加后用SUM汇总 - 没有添加
GROUP BY userid,这样会把所有用户的结果合并成一行,无法得到每个用户单独的统计数据
正确的SQL实现
SELECT userid, -- 统计至少1次访问的时段数量 SUM( CASE WHEN z0 > 0 THEN 1 ELSE 0 END + CASE WHEN z1 > 0 THEN 1 ELSE 0 END + CASE WHEN z2 > 0 THEN 1 ELSE 0 END + CASE WHEN z3 > 0 THEN 1 ELSE 0 END + CASE WHEN z4 > 0 THEN 1 ELSE 0 END + CASE WHEN z5 > 0 THEN 1 ELSE 0 END ) AS visit1, -- 统计至少5次访问的时段数量 SUM( CASE WHEN z0 >= 5 THEN 1 ELSE 0 END + CASE WHEN z1 >= 5 THEN 1 ELSE 0 END + CASE WHEN z2 >= 5 THEN 1 ELSE 0 END + CASE WHEN z3 >= 5 THEN 1 ELSE 0 END + CASE WHEN z4 >= 5 THEN 1 ELSE 0 END + CASE WHEN z5 >= 5 THEN 1 ELSE 0 END ) AS visit5, -- 统计至少10次访问的时段数量 SUM( CASE WHEN z0 >= 10 THEN 1 ELSE 0 END + CASE WHEN z1 >= 10 THEN 1 ELSE 0 END + CASE WHEN z2 >= 10 THEN 1 ELSE 0 END + CASE WHEN z3 >= 10 THEN 1 ELSE 0 END + CASE WHEN z4 >= 10 THEN 1 ELSE 0 END + CASE WHEN z5 >= 10 THEN 1 ELSE 0 END ) AS visit10 FROM timetable GROUP BY userid;
逻辑解释
这个SQL的核心思路很直白:
- 对每个用户的每个时段字段(z0到z5),单独判断是否符合统计条件(比如>0、>=5、>=10),符合就记1,不符合记0
- 把每个用户的所有时段判断结果相加,得到该用户对应条件的时段数量
- 通过
GROUP BY userid确保每个用户的统计结果单独成一行
拿用户4714举例验证:z0=0(不计数)、z1=4(>0记1)、z2=2(>0记1)、z3=0(不计数)、z4=11(>0记1、>=5记1、>=10记1)、z5=0(不计数),最终visit1=3、visit5=1、visit10=1,和你期望的结果完全匹配。
内容的提问来源于stack exchange,提问作者r0f1
相关产品推荐
相关产品推荐

