如何补全SQL计算曾浏览用户个人资料页的用户占比
原有代码问题
你写的查询存在一个常见逻辑错误:LEFT OUTER JOIN 后在WHERE层判断e.event_name = 'view_user_profile',会把没匹配到对应浏览事件的用户全部过滤掉,效果等同于内连接,最终只能拿到有浏览行为的用户列表,没法统计总用户基数,算不出占比。
正确SQL实现
写法1:基于你原有逻辑修正
把事件筛选条件从WHERE移到JOIN的关联条件里,避免过滤无浏览行为的用户,直接一步算出占比:
SELECT ROUND( -- 统计有浏览记录的用户数 / 总用户数,转成百分比保留2位小数 COUNT(CASE WHEN e.event_id IS NOT NULL THEN u.id END) / COUNT(u.id) * 100, 2 ) AS view_profile_user_rate FROM dsv1069.users u LEFT OUTER JOIN dsv1069.events e ON e.user_id = u.id AND e.event_name = 'view_user_profile'
写法2:大表场景下的高性能写法
如果events表数据量很大,JOIN操作会比较慢,可以用子查询分别统计分子分母,避免全表关联:
SELECT ROUND( (SELECT COUNT(DISTINCT user_id) FROM dsv1069.events WHERE event_name = 'view_user_profile') / COUNT(id) * 100, 2 ) AS view_profile_user_rate FROM dsv1069.users
口径说明:第二种写法会自动排除events表中user_id不存在于users表的脏数据,统计结果更贴合「平台注册用户中曾浏览个人资料页的占比」这个需求。
内容的提问来源于stack exchange,提问作者Hristijan Smilkoski
相关产品推荐
相关产品推荐

