慢SSAS累积和计算度量

慢SSAS累积和计算度量,ssas,mdx,olap,olap-cube,Ssas,Mdx,Olap,Olap Cube,我有一个度量的累积和,其结构如下: Aggregate ( { NULL : [Date].[Year - Month - Date].CurrentMember } ,[Measures].[Applications] ) 从首次申请日期到当前日期,日期范围内的天数必须连续 然而,日期维度包含从1900-01-01到未来的日期 我试图通过如下构造计算的度量来消除第一次申请之前的日期和未来的日期: CREATE MEMBER CURRENTCUBE.[Measures].[A

我有一个度量的累积和,其结构如下:

Aggregate (
    { NULL : [Date].[Year - Month - Date].CurrentMember } 
    ,[Measures].[Applications] )
从首次申请日期到当前日期,日期范围内的天数必须连续

然而,日期维度包含从1900-01-01到未来的日期

我试图通过如下构造计算的度量来消除第一次申请之前的日期和未来的日期:

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS
CASE 
WHEN   
    /* Eliminates dates before first applications, i.e. year 1900-01-01 */
    Aggregate (
        { NULL : [Date].[Year - Month - Date].CurrentMember } 
        ,[Measures].[Applications] ) < 0   
THEN NULL
WHEN
    /* Eliminates dates after today */
    [Date].[Year - Month - Date].CurrentMember.MemberValue >= StrToMember('[Date].[Date].&['+Format(Now(),"yyyy-MM-ddT00:00:00")+']').MemberValue 
THEN NULL
ELSE
    Aggregate (
            { NULL : [Date].[Year - Month - Date].CurrentMember } 
            ,[Measures].[Applications] )           
END
创建成员CURRENTCUBE.[Measures].[Applications TD]AS
案例
什么时候
/*消除首次申请前的日期,即1900-01-01年*/
聚合(
{NULL:[日期].[年-月-日].CurrentMember}
,[Measures].[Applications])<0
然后无效
什么时候
/*删除今天之后的日期*/
[Date].[Year-Month-Date].CurrentMember.MemberValue>=StrToMember('[Date].[Date].&['+格式(Now(),“yyyy-MM-ddT00:00:00”)+']')。MemberValue
然后无效
其他的
聚合(
{NULL:[日期].[年-月-日].CurrentMember}
,[措施][应用])
结束
我试图通过仅在需要时使用作用域作为case语句的替代方案、利用EXISTS和EXCEPT函数以及许多其他函数进行聚合来优化这一点,但都没有成功


当浏览多维数据集并通过用户定义的层次结构对其进行尺寸标注时,
[Measures].[Applications TD]
通常比
CASE
快,
SUM
通常比
聚合快
虽然您的主要问题是使用
membervalue
的条件的第二部分,但它是必需的,还是以下情况不会做同样的事情:

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS
IIF(
     SUM (
        { NULL : [Date].[Year - Month - Date].CurrentMember } 
        ,[Measures].[Applications] 
     ) < 0 
   , NULL
   , 
   SUM (
         { NULL : [Date].[Year - Month - Date].CurrentMember } 
          ,[Measures].[Applications] 
    ) 
)

但是


如果您向DimDate添加一个isToday列,然后使用该列具有cubes date维度的属性,那么您就不用为“Today”成员操心了,它将更加高效。通过这种方式,您应该能够简化此
[Date].[Year-Month-Date].CurrentMember.MemberValue>=[Date].[Date].[All].[Today].MemberValue

您需要使用
聚合还是可以使用
Sum
?在这种情况下,Sum应该可以工作。谢谢您的建议。通过这种方法,我可以根据日期构建视觉效果,以查看每天的累计总数。如果没有membervalue的第二部分,基本上直到2027年,每天都会重复到今天的值(DimDate包含到未来10年的日期)。也许这应该完全是另一个问题?@samb0x好的-我现在明白你的问题了,我们的多维数据集在DimDate中只有昨天的日期-这就是我不明白的原因。随着变化,现在的测量速度快吗?你有权对仓库/多维数据集进行更改吗?我已经实现了这个版本,这已经是一个很大的改进。但我不清楚如何构建“[Date].[Date].[All].[Today]”。我在DimDate中有一个新列“Today”,它有今天的日期,然后使用[date].[Year-Month-date]。CurrentMember.MemberValue>=[date].[Today]。项(0)。MemberValue它工作得更好,但我对如何构造“[date].[date].[All].[Today]”感兴趣@samb0x-我的答案是两种不同的方法-要么您现在需要在mdx中构造,要么您需要实现我在
但是
部分中建议的方法
CREATE MEMBER CURRENTCUBE.[Date].[Date].[All].[Today] AS //<< a  little of syntax for this create 
    StrToMember('[Date].[Date].&['+Format(Now(),"yyyy-MM-ddT00:00:00")+']')
CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS
IIF(
    [Date].[Year - Month - Date].CurrentMember.MemberValue >= [Date].[Date].[All].[Today].MemberValue
   , NULL
   , IIF(
       SUM (
          { NULL : [Date].[Year - Month - Date].CurrentMember } 
          ,[Measures].[Applications] 
       ) < 0 
     , NULL
     , 
     SUM (
           { NULL : [Date].[Year - Month - Date].CurrentMember } 
            ,[Measures].[Applications] 
      ) 
  )
)