MySQL简单查询实现按V_ID统计独立用户观看次数的方法
按V_ID去重统计独立观看数的MySQL实现
核心逻辑
这个需求的本质是统计每个视频的独立观看用户数,而非累计播放次数:同一个USER_P_ID的用户,无论对同一个V_ID产生多少条观看记录,都只计1次。
如果直接对原表按V_ID分组、计数行数或是累加原表的VIEW COUNT字段,会把同一用户的重复观看算入,结果会和预期产生偏差,必须在统计中加入「用户+视频」维度的去重。
两种可直接落地的实现
简洁版:直接用COUNT(DISTINCT)去重计数
这是常规场景下最省代码的写法,不需要嵌套子查询,日常统计时直接可用:
SELECT V_ID, COUNT(DISTINCT USER_P_ID) AS view_count FROM View_count GROUP BY V_ID;
运行效果完全匹配预期:
- V1维度下去重后的用户为10、11,计数为2
- V2维度下去重后的用户为12,计数为1
- V3维度下去重后的用户为11、13,计数为2
大数据量优化版:先子查询去重再分组
当View_count表的规模达到百万级以上时,可以先把重复的用户-视频组合筛成最小数据集,再做分组统计,部分场景下性能优于直接COUNT(DISTINCT):
SELECT V_ID, COUNT(*) AS view_count FROM ( -- 筛出所有不重复的 用户-视频 观看组合,每个组合仅保留1条 SELECT DISTINCT USER_P_ID, V_ID FROM View_count ) AS user_video_distinct GROUP BY V_ID;
常见逻辑坑点
注意:这个统计逻辑和原表自带的
VIEW COUNT字段没有关系。直接累加该字段得到的是累计播放次数(PV),没有做用户维度去重——比如样例中直接对V1的VIEW COUNT求和,会得到3(ID1、ID2、ID3三条记录的1相加),和预期的独立用户数2不符,是这个场景下最容易踩的逻辑偏差。
内容的提问来源于stack exchange,提问作者Bala Murugan
相关产品推荐
相关产品推荐

