计算字段里的粒度不一致问题

计算字段里的粒度不一致问题 - 图1

大家写计算字段的时候可能会遇到这类“聚合粒度错误”,那么这个到底是什么意思呢?

其实所谓粒度是指能够区分每一行数据的字段称之为该数据的最细粒度。

通常,我们认为一份明细数据里,每一行都是一个最低粒度。与最细粒度对应的就是聚合粒度,比如SUM,聚合是把多行数据汇总的结果,也就是跨越了多个最细粒度。

上述错误其实是因为[人均奖励领取次数]这个字段本身是一个已经聚合过的计算字段,这个字段的写法其实是SUM(奖励次数)/COUNT(ID),我们把上述错误简化一下,其实相当于:IF A>B THEN SUM(C) ELSE SUM(D)。

细心的用户可能发现了,A>B是最细粒度的比较,而SUM(C)、SUM(D)则是聚合粒度的结果。因此出现了跨粒度的错误。

修改的方法其实也非常简单,有两种:

①SUM(IF A>B THEN C ELSE D)

②IF SUM(A)>SUM(B) THEN SUM(C) ELSE SUM(D)

看到这里应该就明白了跨粒度是怎么一回事了。当然,①和②是完全不同的两种写法,其结果也大不相同,具体采用何种写法应该取决于你的业务目的。

PS,进一步分析①和②的不同,比如有如下明细数据

A B C D

1 2 1 0

1 2 1 0

3 0 1 0

那么显然①得到的结果是(D1=0)+(D2=0)+(C3=1)=1

②公式得到的 sum(C)=3

A B C D

1 2 1 0

1 2 1 0

3 0 1 0

让我们继续展开说一个例子,在数据的聚合里,还有一个非常经典的例子,那就当我们需要得到一个倍率的时候,比如成功率,我们会用成功次数/总次数,其实应当表达为SUM(成功次数)/SUM(次数)=成功率

但是可能在报告制作过程中,有人会做成SUM(成功次数/次数),这二者区别我们用一段数据表示

次数 成功数

5 2

4 1

这里的成功率=(2+1)/(5+4),理解为全部实验的成功率

如果变成(2/5) + (1/4)那是完全不同的结果,意义变成了单次实验成功率之和了

因此,我们需要深入理解聚合与粒度的关系,才能得到我们希望的结果