多列分组生成聚合表后,求和uv列数值偏高的问题求助
问题原因分析
你遇到的核心问题是重复计数:原始表中同一个visit_id可能对应多个不同的ID、pages、post_evar10/205/5组合,在构建聚合表temp.xy时,这个visit_id会被分到多个分组中,每个分组的uv都会将其统计一次。当你后续执行sum(uv)时,就把同一个访客多次累加,导致结果远高于正确值。
解决方案
根据你的需求(生成聚合表供Tableau导入,同时保证统计准确),提供两种可行方案:
方案一:修改聚合表查询逻辑,二次聚合时重新去重
不需要调整聚合表temp.xy的构建逻辑,直接在查询时改用count(distinct visit_id)而非sum(uv):
select post_evar8, MY, count(distinct visit_id) as uv from temp.xy where MY >= 202110 and MY <= 202112 group by post_evar8, MY;
这种方法的好处是无需重构聚合表,且聚合表已经过滤了原始表中的重复行(同一维度组合下的多条记录),数据量远小于原始表,适合Tableau导入。
方案二:重构聚合表,先按访客维度去重
如果希望聚合表本身能支持更灵活的分析,可先对原始表按MY+visit_id去重,确保每个访客在每个月份只保留一条维度记录,再构建聚合表:
步骤1:生成访客维度快照表
create table temp.visit_dim as select MY, visit_id, -- 注意:如果一个visit_id对应多个同维度值(比如多个pages),需根据业务规则选择聚合方式 -- 示例用max取最大值,也可使用collect_set聚合所有值,或取首次/末次出现的值 max(ID) as ID, max(pages) as pages, max(post_evar10) as post_evar10, max(post_evar205) as post_evar205, max(post_evar8) as post_evar8, max(post_evar5) as post_evar5 from temp.raw_data group by MY, visit_id;
步骤2:基于快照表构建聚合表
create table temp.xy as select MY, ID, pages, post_evar10, post_evar205, post_evar8, post_evar5, count(distinct visit_id) as uv from temp.visit_dim group by MY, ID, pages, post_evar10, post_evar205, post_evar8, post_evar5;
步骤3:查询聚合表获取正确UV
此时无论是count(distinct visit_id)还是sum(uv)(因为每个visit_id在聚合表中仅出现一次)都能得到正确结果:
select post_evar8, MY, sum(uv) as uv from temp.xy where MY >= 202110 and MY <= 202112 group by post_evar8, MY;
内容的提问来源于stack exchange,提问作者NewCode
相关产品推荐
相关产品推荐

