如何按用户分组统计指标并计算单服务器最大事件数?
解决方案
假设你的数据表名为server_event_records,核心字段包括user(用户标识)、server(服务器标识)、event_status(事件状态,取值如success/failure),可以通过CTE(公共表表达式)+ 两层分组聚合实现需求,具体SQL如下:
WITH server_level_stats AS ( -- 第一步:按用户+服务器分组,计算单台服务器的事件统计 SELECT user, server, COUNT(*) AS server_total_events, SUM(CASE WHEN event_status = 'success' THEN 1 ELSE 0 END) AS server_success_events, SUM(CASE WHEN event_status = 'failure' THEN 1 ELSE 0 END) AS server_failure_events FROM server_event_records GROUP BY user, server ) -- 第二步:按用户分组,聚合统计并提取单服务器最大事件数 SELECT user, COUNT(DISTINCT server) AS total_servers, SUM(server_total_events) AS total_events, SUM(server_success_events) AS total_success_events, SUM(server_failure_events) AS total_failure_events, MAX(server_total_events) AS max_events_per_single_server FROM server_level_stats GROUP BY user ORDER BY user;
代码说明
- CTE段(server_level_stats):先对每个用户下的每台服务器做子分组统计,算出单服务器的总事件数、成功/失败事件数,为后续用户层面的聚合做准备。
- 外层查询:
COUNT(DISTINCT server):统计用户拥有的唯一服务器数量;SUM(server_total_events):累加所有服务器的事件数,得到用户总事件数;SUM(server_success_events)/SUM(server_failure_events):同理累加成功、失败事件总数;MAX(server_total_events):从用户所有服务器的事件数中取最大值,即单台服务器的最大事件数。
适配调整
如果你的表结构或字段名不同,只需对应修改:
- 替换
server_event_records为实际表名; - 若
event_status是布尔类型(比如1代表成功,0代表失败),可简化SUM逻辑:SUM(event_status)替代成功事件统计,SUM(1 - event_status)替代失败事件统计; - 若用户/服务器标识字段是
user_id/server_id,替换相应字段名即可。
内容的提问来源于stack exchange,提问作者davka
相关产品推荐
相关产品推荐

