如何处理表得到目标event_rate结果?GROUP BY与PARTITION BY该选哪个?
解答:GROUP BY vs PARTITION BY 计算事件比率
嘿,咱们先把你的需求和场景理清楚:
你的数据与目标
首先是你手里的原始表(表1):
表1(原始数据)
msisdn_b msisdn_a event 1111 222 0 1111 333 0 1111 777 1 2222 567 0 2222 571 1 2222 572 1
你想要的是按msisdn_b分组,算出每个组里event总和与总记录数的比值(也就是event_rate),得到下面的表2:
表2(期望结果)
msisdn_b event_rate 1111 0.333333333 2222 0.666666667
核心结论:只用GROUP BY就够了
这个需求完全不需要PARTITION BY,用GROUP BY是最直接、高效的方案。
为啥选GROUP BY?
你的目标是把同一个msisdn_b的所有行合并成一行,输出聚合后的统计结果——这正是GROUP BY的本职工作。
给你写个标准SQL的示例:
SELECT msisdn_b, SUM(event) / COUNT(*) AS event_rate FROM 你的表名 GROUP BY msisdn_b;
简单解释下:
SUM(event):统计每个msisdn_b分组里event=1的总次数(因为event只有0和1,求和就是1的数量)COUNT(*):统计每个分组的总记录数- 两者相除就得到了你要的事件比率
那PARTITION BY什么时候用?
PARTITION BY是窗口函数的语法,它的作用是不合并原始行,给每一行添加上对应分组的统计值。举个例子,如果你想保留原始表的所有6行数据,同时在每行后面加上该msisdn_b对应的event_rate,这时候才需要用PARTITION BY:
示例SQL是这样的:
SELECT msisdn_b, msisdn_a, event, SUM(event) OVER (PARTITION BY msisdn_b) / COUNT(*) OVER (PARTITION BY msisdn_b) AS event_rate FROM 你的表名;
这个查询会返回6行,每行都带着对应分组的比率,但这显然不是你要的表2结果。
一句话总结
- 要聚合分组后得到单行统计结果:用
GROUP BY - 要保留原始行,同时追加分组统计信息:用
PARTITION BY(窗口函数)
你的需求属于第一种,所以只用GROUP BY就搞定啦。
内容的提问来源于stack exchange,提问作者Jacek Średziński
相关产品推荐
相关产品推荐

