本次问题根源是前后端数据处理的机制差异
1、问题描述:
在某次会员活动中,需要汇总以下数据:
1、总访问次数:统计某活动首页PV -- (visit_counts)
2、总访问人数:统计某活动首页UV -- (visit_persion_counts)
3、总参与人数:统计某活动参与抽奖的人数,去重 -- (participate_counts)
4、总分享数:某活动首页分享次数 -- (share_counts)
2、问题分析:
1、总访问次数、总分享数都是全量统计,包括重复操作;总访问人数、总参与人数都是人员统计,要去重操作;
2、前端H5开发人员,提供了三个关键标识字段:
访问eventKey:wheelVisitCnt
抽奖eventKey: wheelDrawPrize
分享eventKey: wheelShare
2.1 错误想法(被H5人称为面向对象想法):
1、通过eventKey=‘wheelDrawPrize’,区分出抽奖的;通过eventKey=‘wheelShare’,区分出分享的;(这个没有问题)
2、由于总访问人既包括抽奖的、分享的、既没抽奖又没分享的三种,所以认为对于一个参与抽奖、分享的人来说他应该有两个eventkey来标记;(理解上没有毛病,但实际上是错误的)
2.2 错误原因:
这个你不要用面向对象的思想去想,首先这个统计针对的某个动作做的统计,这个动作被执行多少次;然后这个动作又有多少人;最后得到统计的参与抽奖人数,分享次数,总访问人数结果。
所以eventKey=‘wheelVisitCnt’得到的就是所有的访问量;eventKey=‘wheelDrawPrize’得到的就是所有的参与抽奖量;通过eventKey=‘wheelShare’得到的就是所有的分享量。
3、问题处理:
visit_counts BIGINT comment "总访问次数",
sum(case when eventkey='wheelVisitCnt' then 1 else 0 end),
visit_persion_counts BIGINT comment "总访问人数",
count(distinct open_id case when eventkey='wheelVisitCnt') as visit_persion_counts,
-- count(distinct openid) as visit_persion_counts,
-- count(distinct case when eventkey='wheelVisitCnt' then open_id else null end) as visit_persion_counts,
participate_counts BIGINT comment "总参与人数",
count(distinct open_id case when eventkey='wheelDrawPrize') as participate_counts,
--count(distinct case when eventkey='wheelDrawPrize' then open_id else null end) as participate_counts,
share_counts BIGINT comment "总分享数",
sum(case when eventkey='wheelShare' then 1 else 0 end) as share_counts,