zoukankan      html  css  js  c++  java
  • 【转载】OLAP中的AverageOfChildren聚合方式

    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下,似乎这个聚合方式已经变成了对小时求平均,而不是以天作为最小单位。反正不管怎么样,这个聚合方式实在没什么太大作用)



  • 相关阅读:
    维护需求与新增需求
    LoadRunner如何在注册业务脚本中设置参数化唯一性
    常用的功能测试方法
    应用代码性能诊断分析之内存泄漏
    (52)ElasticSearch之字符串排序问题
    (51)ElasticSearch之query string查询及copy_to的使用
    (50)ElasticSearch之分页查询中的deep paging问题
    (49)ElasticSearch之多index,多type查询
    (48)ElasticSearch之查询结果分析
    (47)ElasticSearch之bulk语法格式解析
  • 原文地址:https://www.cnblogs.com/xiongnanbin/p/3049427.html
Copyright © 2011-2022 走看看