Mondrian Schema uniqueMembers

时间:2014-09-23 12:56:21

标签: olap olap-cube mondrian saiku

我正在使用Mondrian与Pentaho和Saiku在MySQL数据库上进行OLAP分析。 我有一个2维数据库(受益人和成员)链接到事实表。 受益人具有以下字段:beneficiary_type1,beneficiary_type2,beneficiary_type3。 会员拥有性别领域。

我创建了一个使用以下内容定义的Mondrian模式:

<Dimension type="StandardDimension" visible="true" foreignKey="beneficiary_id" highCardinality="false" name="beneficiary">
  <Hierarchy visible="true" hasAll="true" primaryKey="id">
    <Table name="beneficiary">
    </Table>
    <Level name="beneficiary_type1" visible="true" column="beneficiary_type1" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
    </Level>
    <Level name="beneficiary_type2" visible="true" column="beneficiary_type2" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
    </Level>
    <Level name="beneficiary_type3" visible="true" column="beneficiary_type3" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
    </Level>
  </Hierarchy>
</Dimension>

<Dimension type="StandardDimension" visible="true" foreignKey="member_id" highCardinality="false" name="member">
  <Hierarchy visible="true" hasAll="true" primaryKey="id">
    <Table name="member">
    </Table>
    <Level name="gender" visible="true" column="gender" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
    </Level>
  </Hierarchy>
</Dimension>

我希望能够(单独)查看: 受益人类型1的男性/女性数量, 受益人类型2的男性/女性数量, 受益人的类型为男性/女性_3,

如果我将性别拖到beneficiary_type1上,那么我会看到以下内容,这是正确的:

olap1

如果我将性别拖到beneficiary_type2上,那么我会看到以下内容,这是不正确的:

olap2

由于这是beneficiary_type2列,因此在添加两个字段时可以看到由benefiiary_type1分组:

enter image description here

当在beneficiary_type2上查看性别时,我希望只能看到2行,即#34;成人&#34;和#34;孩子到19岁和34岁。根据我的阅读,似乎应该在beneficiary_type2级别设置uniqueMembers属性,但这会产生以下结果:

enter image description here

这会产生正确的编号结果,但行仍然显示为按受益人类型1分组。此外,这种方式不允许生成在beneficiary_type1下正确分组的beneficiary_type2,如在第三个图像中一样(编号结果永远不会根据父级别分组)。

我应该如何构建模式以使我在分析中包含的父级确定行数? (使用saiku拖入多维数据集)即,当在beneficiary_type1和beneficiary_type2中拖动时,根据beneficiary_type1(如第三个图像)对beneficiary_type2进行分组,如果只有beneficiary_type2,则根据其自己的唯一值进行分组(2行,一个用于&# 34;成人&#34;一个用于&#34;孩子到19&#34;)。

我对OLAP比较陌生,所以可能会有一些我不理解的基本概念。如果有任何解释,请不要犹豫。

--------------------更新--------------------

正如@nsousa所解释的,同一层次结构中的成员意味着父子关系。以下是对模式的正确更改吗?

<Dimension type="StandardDimension" visible="true" foreignKey="beneficiary_id" highCardinality="false" name="beneficiary">
  <Hierarchy visible="true" hasAll="true" primaryKey="id">
    <Table name="beneficiary">
    </Table>
    <Level name="beneficiary_type1" visible="true" column="beneficiary_type1" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
    </Level>
  </Hierarchy>
  <Hierarchy visible="true" hasAll="true" primaryKey="id">
    <Table name="beneficiary">
    </Table>
    <Level name="beneficiary_type2" visible="true" column="beneficiary_type2" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
    </Level>
  </Hierarchy>
  <Hierarchy visible="true" hasAll="true" primaryKey="id">
    <Table name="beneficiary">
    </Table>
    <Level name="beneficiary_type3" visible="true" column="beneficiary_type3" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
    </Level>
  </Hierarchy>
</Dimension>

我是否理解为替代解决方案是为受益人表加载3个单独的维度?这是否意味着数据库中还需要存在3个单独的表(每个受益成员一个表),或者同一个表可以用于多个维度?显然,为每个成员建一个数据库表并不理想,这样做有什么好处吗?

1 个答案:

答案 0 :(得分:2)

您的beneficiary_type2级别是beneficiary_type1的后代。因此,即使成员名称匹配,第2级的两个“成人”也不是同一成员,除非他们也有相同的父母。

由于他们有不同的父母,他们是有共同名称的堂兄弟。因此,您会获得多行。

执行所需操作的唯一安全方法是将各个级别拆分为多个维度/层次结构,而不是具有父子层次结构。

在不同的层次结构中,type1和type2之间没有关系,只能得到你想要的两个不同的字符串。