哎呀妈呀,我说这数据奇奇怪怪,看了一上午终于明白了!
我现在要计算百分位数的的真实数据是这样的:
【1X277,3X43,5X10,9X41,15X10,25X6,27X3,45X1】
AXB表示数列中A有B个
然后我使用上一篇文章提到的PERCENTILE_APPROX
函数计算0.8分位数thr,用thr作为阈值对数据分组,奇怪的是,小于等于thr的数竟然不到80%,按正常逻辑来想的话,应该大于80%才对,因为可能有多个值都等于thr,总之,至少不能少于80%。
于是,开始探索。。
我发现当计算分位数的数列里出现重复数据时,hive sql里PERCENTILE_APPROX
的计算逻辑是这样的:
以上面的数列为例
- 计算分位点数位置:391*0.8=312.8
- 计算分位点数:1+(3-1)*(312.8-277)/43=2.6651
他是会把重复数当做一个数来计算分位数和上下紧邻值的距离,而不是按我之前以为的“数据按从小到大排,312和313都是3,分位点数就是3”。这样也解释了为什么按这个阈值划分后,小于等于thr的数不到80%。