Ssas 使用intersect和2个大集合来获得不同的计数-MDX

Ssas 使用intersect和2个大集合来获得不同的计数-MDX,ssas,mdx,Ssas,Mdx,我有一个代表活跃客户的计算会员。这将是以下内容 WITH MEMBER [Measures].[Active Customers] AS Count ( nonempty( Filter ( ( [Customer].[Customer Key].Members, [Measures].[Turnover] ), [Measures].[Turnover] > 0 ) ) ) 当我想获得当前期间和以前期间的活跃客户时,这非常有效,因为我获得了我的时间维度,并使用

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

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万条记录的子集

因此,在检查连续两个期间处于活动状态的客户时,我会这样做(活动的前一个期间和活动的当前期间基本上是上面计算的成员,但是使用CurrentMemberCurrentMember.PrevMember):


这需要永远是否仍有改进的地方,或者解决使用大型集合的INTERSECT的性能问题?或者对MDX查询进行优化?我一直尝试使用customers维度的子集,但这只会将记录数减少到不到400万条,因此仍然很大。任何帮助都将不胜感激

如果您尽可能避免使用命名集和计算成员,我假设您可以加快速度

实现这一点的一个步骤如下:创建一个新的事实表,其中外键仅适用于您的客户和时间维度,如果客户当天处于活动状态,则向其添加一条记录。构建一个度量值组,比如说基于这个表的“activeCustomers”,只使用“count”作为度量值。但是让它隐形,因为我们不需要它

然后,您可以替换

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


Hi@FrankPI-我试图避免创建任何新的表,或者基于视图的度量组,并且只使用MDX/计算集/成员。我上面的命名集已经是实际集的一个子集,但我的性能仍然很差。因此,在上面的编码方面没有什么可以改进的?我在回答的末尾添加了另一个不需要更改表结构的想法。过滤器第二个参数[Measures]。[Active Previous Period]会以任何方式限制条件吗?@Mez我不理解你的问题。但是
Intersect(Filter(S,cond1),Filter(S,cond2))
在逻辑上等同于
Filter(S,cond1和cond2)
。Hi@FrankPI,我创建了一个基于客户的视图,这些客户一直处于活动状态(必须在活动事实中至少有一条记录),这大大限制了我的客户设置。因此,现在,当我想看到客户在当前期间、上一期间等活动时,MDX查询运行得非常快。但是,当获取在两个期间活动的客户时,仍然很慢。最好的方法是什么?
count( nonempty( Filter (
( [Customer].[Customer Key].Members, [Measures].[Turnover] ),
[Measures].[Turnover] > 0
) ) )
count( Exists(
[Customer].[Customer Key].Members,
<state your time selection here>,
"activeCustomers"
) )
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
   )