SQL如何统计登录1次、2次、3次的对应用户数量?
解决方案
你当前的核心需求是对单用户登录次数的聚合结果做二次聚合,由于SQL执行顺序的限制,聚合生成的occurrences字段无法直接在当前查询的GROUP BY子句中使用,只需要将你现有的查询作为临时中间表,在外层做二次统计即可,以下是两种可直接在Mode平台运行的实现方案:
方案1:子查询嵌套实现
SELECT occurrences AS 登录次数, COUNT(user_id) AS 用户数量 FROM ( SELECT Users.user_id, COUNT(Users.user_id) AS occurrences FROM tutorial.playbook_users Users JOIN tutorial.playbook_events EVENTS ON Users.user_id = EVENTS.user_id WHERE EVENTS.event_name = 'login' GROUP BY 1 ) AS user_login_stats WHERE occurrences IN (1,2,3) -- 只统计登录1、2、3次的情况,不需要限制可删除该行 GROUP BY 1 ORDER BY 1
方案2:CTE(公共表表达式)实现
逻辑更清晰,可读性更高:
WITH user_login_stats AS ( SELECT Users.user_id, COUNT(Users.user_id) AS occurrences FROM tutorial.playbook_users Users JOIN tutorial.playbook_events EVENTS ON Users.user_id = EVENTS.user_id WHERE EVENTS.event_name = 'login' GROUP BY 1 ) SELECT occurrences AS 登录次数, COUNT(user_id) AS 用户数量 FROM user_login_stats WHERE occurrences IN (1,2,3) -- 只统计登录1、2、3次的情况,不需要限制可删除该行 GROUP BY 1 ORDER BY 1
原理说明
SQL的执行顺序为FROM/JOIN→WHERE→GROUP BY→聚合计算→HAVING→SELECT→ORDER BY,你在原有查询中定义的occurrences别名在GROUP BY执行阶段还未生成,因此无法直接引用,必须先将聚合结果存储为临时表后再做二次分组统计。
内容的提问来源于stack exchange,提问作者Bogi
相关产品推荐
相关产品推荐

