SQL多列统计求助:统计不同会话数对应的用户数量
解决方法
要实现你需要的统计,得分两步操作:先统计每个用户的会话数量,再针对会话数量分组统计对应的用户数。
第一步:统计单个用户的会话数
先用GROUP BY UserID按用户分组,统计每个用户拥有的唯一会话数(如果你的SessionID不会重复,也可以去掉DISTINCT,但加上能避免重复会话被重复计数,更严谨):
SELECT UserID, COUNT(DISTINCT SessionID) AS session_count FROM table1 GROUP BY UserID
这一步会输出每个用户对应的会话数量列表。
第二步:按会话数统计用户数量
把上面的结果作为临时表,再按session_count分组,统计有多少用户属于该会话数:
SELECT session_count, COUNT(UserID) AS user_count FROM ( SELECT UserID, COUNT(DISTINCT SessionID) AS session_count FROM table1 GROUP BY UserID ) AS user_session_counts GROUP BY session_count ORDER BY session_count;
更易读的CTE写法(适用于MySQL 8+、SQL Server等支持CTE的数据库)
如果你的数据库支持公共表表达式(CTE),可以写成更清晰的形式:
WITH user_session_counts AS ( SELECT UserID, COUNT(DISTINCT SessionID) AS session_count FROM table1 GROUP BY UserID ) SELECT session_count, COUNT(UserID) AS user_count FROM user_session_counts GROUP BY session_count ORDER BY session_count;
你的原SQL问题说明
你之前的SQL没有分组,COUNT(UserID)返回的是表的总行数(若UserID不为空),COUNT(SessionID)是所有会话ID的总数,没有按用户拆分,所以无法得到“不同会话数对应的用户数量”的结果。
内容的提问来源于stack exchange,提问作者T_sql1836
相关产品推荐
相关产品推荐

