SQL实现按用户维度统计去重后的事件数量
统计需求说明
现有业务数据表包含字段:
ID | event | user | time | note | archived
需统计每名用户参与的事件总数量,统计规则为同一用户对应同一事件的多条记录仅计数1次,不做重复累计,最终输出字段结构为:
user | nrofevents
实现方案
使用COUNT(DISTINCT)聚合函数搭配分组查询即可实现,该写法兼容绝大多数主流关系型数据库,参考SQL如下:
SELECT `user`, COUNT(DISTINCT event) AS nrofevents FROM 替换为实际业务表名 -- 若需过滤无效记录可在此添加WHERE条件,例:WHERE archived = 0 GROUP BY `user`;
补充说明
user属于多数SQL方言的保留关键字,查询时建议用反引号包裹转义,避免触发语法错误- 若需限定统计范围(如指定时间区间、排除已归档记录),直接在
GROUP BY子句前添加对应WHERE过滤条件即可 - 若使用极个别不支持
COUNT(DISTINCT)语法的老旧数据库版本,可先通过子查询对user和event去重后再分组计数,参考写法:
SELECT `user`, COUNT(event) AS nrofevents FROM ( SELECT DISTINCT `user`, event FROM 替换为实际业务表名 -- 此处同样可添加WHERE过滤条件 ) t GROUP BY `user`;
内容的提问来源于stack exchange,提问作者Ondřej Douša
相关产品推荐
相关产品推荐

