首页 > BI/数据库 > OLAP中的AverageOfChildren聚合方式

OLAP中的AverageOfChildren聚合方式

BI/数据库 ,

BI项目中,我们经常需要设计“平均值”这样的指标,例如电子商务中的平均销售额,Web分析中的平均访问时长,等等。而Analysis Service中提供了一个“AverageOfChildren”的聚合方式,看上去好像就是为了这样的需求而设计的。

但是测试结果却发现,得到的数据根本就不是我们期望的。后来查资料找到了关于这个聚合方式的说明:

AverageOfChildren——对某个成员的聚合值等于其所有子成员的平均值。

这是什么意思呢?假设我定义了一个“总销售额”和“平均销售额”这两个指标。当我看中国的数据的时候,假设中国的总销售额是34000万的话,因为中国下面有34个省级行政区(34个Member),因此平均销售额就是1000万。这是按照字面上的理解。但实际上,这样理解是错误的。MSDN上给出的解释并没有明确指明,AverageOfChildren这个聚合方式只是针对时间维度起作用

在Analysis Service中内置了很多常见的维度类型,如时间维度,地理纬度,帐户维度等。你可以将你创建的维度的“类型”属性标记为内置的维度类型。这样的好处是,Analysis Service对这些标记为特殊类型的维度有额外的支持。例如如果你的Cube中包含一个标记为“时间维度”类型的维度时,那么你就可以在Mdx中使用和时间相关的函数,如Ytd等。类似的,AverageOfChildren这个聚合类型也是需要时间维度的支持,你首先需要在工程中显式指定至少一个时间维度。这个聚合方式的意义就是对所有的时间——以天为单位——求平均值。例如当前时间维度选择的成员是[2003年],而03年有销售额数据的共有365天,那么

AverageOfChildren(销售额) =  总销售额 / 365

如果范围再进一步缩小,选择[2003年3月份],由于3月份每天都有销售额,因此AverageOfChildren就等于总销售额除以31。你可以按具体日期去查看,你会发现,每天的总销售额和平均销售额是一样的。这是因为具体日期的粒度已经是最小的了。

image

由于这个AverageOfChildren聚合方式只是针对时间维度的,不能满足大量的应用场景,因此通常我们都需要自己定义这样一个求平均值的计算指标。公式很简单:

平均值=总值 / 维度成员个数

例如我们想看月利润平均值,那么首先我们定义一个“总利润”的指标,那么

月利润平均值 = 总利润 / Count([Time].[CalendarMonth].children)

(update: 在Analysis Services 2008下,似乎这个聚合方式已经变成了对小时求平均,而不是以天作为最小单位。反正不管怎么样,这个聚合方式实在没什么太大作用)

——Kevin Yang

本博客遵循CC协议2.5,即署名-非商业性使用-相同方式共享
写作很辛苦,转载请注明作者以及原文链接~
如果你喜欢我的文章,你可以订阅我的博客:-D点击订阅我的文章

  1. | #1

    AverageOfChildren和时间粒度有关,总是取粒度最细的成员,你的时间粒度是小时?

    • Kevin Yang
      | #2

      想了一下,确实有道理,是和最小时间粒度有关系,我之前用的例子的时间粒度是到天的,后来测试用的例子是实际的项目,粒度是到小时的。不过还是没看出有什么实际应用场景

  1. 暂时没有trackbacks.