使用带有2个大集的交叉来获得不同的计数 - MDX

时间:2014-09-22 08:47:31

标签: ssas mdx

我有一个代表活跃客户的计算成员。那将是以下内容;

WITH MEMBER [Measures].[Active Customers] AS
  Count ( nonempty( Filter (
    ( [Customer].[Customer Key].Members, [Measures].[Turnover] ),
    [Measures].[Turnover] > 0
  ) )  )

这非常有用,当我想在当前时期和之前的时间内获得活跃客户时,我得到我的时间维度,并使用具有延迟功能的CurrentMember,CurrentMember.PrevMember和CurrentMember,以便获得客户在以前的时期活跃。

我的问题是,当我想得到不同成员中常见的客户数量时。假设我希望获得当前期间活跃的客户,而不是上一期间的客户。或者另一种情况,在当前活动,在以前活动。因此,我需要使用 INTERSECT 功能,我的客户维度有400万条记录。这已经是900万条记录的子集。

因此,在检查连续2个时段处于活动状态的客户时,我这样做(活动上一个时段,活动当前时段基本上是上面的计算成员,但 CurrentMember CurrentMember.PrevMember ):

set [Previous Active Customers Set] AS
   Filter (
    ( [Customer].[Customer Key].Members, [Measures].[Active Previous Period] ),
    [Measures].[Active Previous Period] > 0
   ) 

set [Current Active Customers Set] AS
   Filter (
    ( [Customer].[Customer Key].Members, [Measures].[Active Current Period] ),
    [Measures].[Active Current Period] > 0
   )  

member [Measures].[Active 2 consecutive periods] as 
count(INTERSECT([Current Active Customers Set],[Previous Active Customers Set]) )

这需要永远。 无论如何要改进,或解决使用INTERSECT和大型套装的性能问题?或者可能对MDX查询进行了优化?我总是尝试使用我的客户维度的子集,但这只会将记录数量减少到不到400万 - 所以它仍然很大。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

如果您尽量避免使用命名集和计算成员,我认为您可以加快速度。

这样做的一个步骤如下:创建一个新的事实表,其中只有您的客户和时间维度使用外键,如果客户当天处于活动状态,则向其添加记录。建立一个衡量小组,让我们说" activeCustomers"基于此表,只需使用" count"作为衡量标准。但是让它变得不可见,因为我们不需要它。

然后,您可以替换

count( nonempty( Filter (
( [Customer].[Customer Key].Members, [Measures].[Turnover] ),
[Measures].[Turnover] > 0
) ) )

count( Exists(
[Customer].[Customer Key].Members,
<state your time selection here>,
"activeCustomers"
) )

Exists应该比Filter更有效。

另一种优化方法可能是观察到,不是交叉通过Filter生成的两个集合,而是可以定义一个具有更复杂过滤器的集合,避免AS沿着客户循环两次,然后交叉结果:

set [Active Customers Set] AS
   Filter (
    ( [Customer].[Customer Key].Members, [Measures].[Active Previous Period] ),
    [Measures].[Active Previous Period] > 0
    AND
    [Measures].[Active Current Period] > 0
   )