多事件类型下按账户统计distinct user_id的SQL查询问题求助
多事件类型下的Distinct User ID统计问题解决方法
你当前的查询存在两个关键问题:
- 多个CASE语句之间缺少逗号分隔,会直接触发语法错误
- 把
COUNT(DISTINCT)嵌套在CASE内部的写法,会因为GROUP BY account_name的作用,统计的是全表符合条件的用户数,而非对应事件类型下的独立用户数
正确实现方式
使用条件聚合,将CASE逻辑嵌入COUNT(DISTINCT)内部,就能针对每个事件类型单独统计对应账户下的独立用户数:
SELECT account_name, COUNT(DISTINCT CASE WHEN event_text = 'birthday' THEN user_id END) AS birthday_unique_users, COUNT(DISTINCT CASE WHEN event_text = 'wedding' THEN user_id END) AS wedding_unique_users FROM `table` GROUP BY account_name
逻辑说明
- 每个
COUNT(DISTINCT ...)中的CASE语句,只会保留对应事件类型的user_id,其他情况返回NULL;而COUNT函数会自动忽略NULL值,以此实现按事件过滤后的独立用户统计 - 通过
AS给每个统计字段设置别名,能让结果更易识别
优化建议(可选)
如果只需要统计指定的几种事件,可以添加WHERE条件缩小扫描范围,提升查询效率:
SELECT account_name, COUNT(DISTINCT CASE WHEN event_text = 'birthday' THEN user_id END) AS birthday_unique_users, COUNT(DISTINCT CASE WHEN event_text = 'wedding' THEN user_id END) AS wedding_unique_users FROM `table` WHERE event_text IN ('birthday', 'wedding') GROUP BY account_name
内容的提问来源于stack exchange,提问作者j.lea
相关产品推荐
相关产品推荐

