SSAS - 如何处理具有有效重复项的维度?

Posted

技术标签:

【中文标题】SSAS - 如何处理具有有效重复项的维度?【英文标题】:SSAS - How do I handle dimensions with valid duplicates? 【发布时间】:2013-09-15 21:51:13 【问题描述】:

我是 SSAS 新手,遇到了一个无法解决的问题。让我们从两张表开始,这是一张包含账户及其值的事实表:

  Fact Table
==============
Account Value
==============
   1     10
   2     20
   3     30

然后是提供维度的帐户层次结构表。此维度包含帐户层次结构。帐户被分组到组中,一个给定的帐户可以根据需要多次放置在几个不同的组中。不可能在同一组内拥有两次或多次相同帐户的情况。出于性能原因,使用HideMemberIf 属性对层次结构进行了自然化(这是正确的术语吗?)。群体本身没有价值,他们从孩子的集合中获取价值。真正的层次结构有 16 个级别,但为简单起见,这里是一个只有 4 个级别的示例:

          Dim Groups-Accounts
========================================
Level 0    Level 1    Level 2    Level 3
========================================
Group 0    Group 0    Group 0    Group 0
Group 0    Group 1    Group 1    Group 1    (empty group)
Group 0    Group 2    Group 2    Group 2
Group 0    Group 2    Account 1  Account 1
Group 0    Group 3    Group 3    Group 3
Group 0    Group 3    Account 2  Account 2
Group 0    Group 3    Account 3  Account 3
Group 0    Group 4    Group 4    Group 4
Group 0    Group 4    Group 5    Group 5
Group 0    Group 4    Group 5    Account 2
Group 0    Group 4    Group 5    Account 3
Group 6    Group 6    Group 6    Group 6    (empty group)

在导航维度时,这将导致如下结果:

======================================
Level 0  Level 1   Level 2   Level 3
======================================
Group 0
         Group 1
         Group 2
                  Account 1
         Group 3
                  Account 2
                  Account 3
         Group 4
                   Group 5
                             Account 2
                             Account 3
Group 6

目标是将归化层次结构的最后一级(在本例中为 3 级)与事实表中的适当值相关联:

=================================================
Level 0  Level 1   Level 2   Level 3       Value
=================================================
Group 0                                     110
         Group 1                              0
         Group 2                             10
                  Account 1                  10
         Group 3                             50
                  Account 2                  20
                  Account 3                  30
         Group 4                             50
                   Group 5                   50
                             Account 2       20
                             Account 3       30
Group 6                                       0

问题?在处理维度时,SSAS 抱怨 Errors in the OLAP storage engine: A duplicate attribute key has been found when processing: Table: 'CT_DimGroupsAccounts', Column: 'Level_3', Value: 'Account 2'. The attribute is 'Level_3'.。这是真的,因为帐户 2 和帐户 3 在级别 3 属性中是重复的。如果我告诉 SSAS 忽略重复键错误,则处理成功结束。但是,当导航生成的多维数据集时,结果是:

=================================================
Level 0  Level 1   Level 2   Level 3       Value
=================================================
Group 0                                      60
         Group 1                              0
         Group 2                             10
                  Account 1                  10
         Group 3                             50
                  Account 2                  20
                  Account 3                  30
         Group 4                              0
                   Group 5                    0
Group 6                                       0

重复的键(帐户 2 和 3 作为组 5 的子项)不在维度中,结果不正确。在这种情况下,我怎样才能获得正确的结果?

【问题讨论】:

如果账户 2 上发生交易,是什么决定了该交易是通过第 3 组还是第 5 组?还是总是两者都经历? 在这种情况下,它应该始终通过两个组。而在真实维度中,如果一个账户被更新,那么该账户在维度中的每一次出现都应该被更新。 看我的回放here,希望对你有帮助 【参考方案1】:

在极少数情况下,这可能会发生。由于层次结构需要一个独特的解决方案,这就是您可以在 SSAS 维度结构中解决问题的方法,如果您在维度表上有一个基于整数的主键,则可以采用这种方法。

1) 对于维度结构中的每个属性,在属性部分中,您有一个定义的 KeyColumns。默认值为列本身。当您有重复项时,扩展属性的定义键以包含一列或多列:如下:

属性 -> 键列

------------------- -------------------

MyTopLevelAttribute -> 我的TopLevelAttribute

NextLevel1Attribute -> NextLevel1Attribute + uniquetablePK

如果您没有唯一键,您仍然可以使用其他可提供唯一值的列来构建较低级别的键列,但您应该采用这种方法。关键是扩展 KeyColumns 属性。

【讨论】:

【参考方案2】:

在属性之间提供适当的关系。创建父子层次结构。并提供它们之间的关系。它应该可以正常工作..

【讨论】:

以上是关于SSAS - 如何处理具有有效重复项的维度?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 SCD 类型 2 维度和重复维度记录?

如何找到具有重复项的集合的所有子集? [关闭]

如何处理数据仓库中重复id包含略有不同值的维度表?

如何处理SCD 2类维和重复维记录?

SSAS 表格,处理维度空白值

自然模板(例如Thymeleaf)时如何处理代码重复?