慢速 SSAS 累积和计算度量
Slow SSAS cumulative sum calculated measure
我有一个度量的累积总和,其结构如下:
Aggregate (
{ NULL : [Date].[Year - Month - Date].CurrentMember }
,[Measures].[Applications] )
从第一次申请的日期到现在的日期,日期范围内的天数必须是连续的。
然而,日期维度包含从 1900 年 1 月 1 日到未来很长一段时间的日期。
我试图通过按如下方式构建计算的度量来消除第一次申请之前的日期和未来的日期:
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
我试图通过仅在需要的地方聚合来优化它,使用 SCOPE 作为 case 语句的替代方法,利用 EXISTS 和 EXCEPT 函数以及许多其他函数,但都没有成功。
当浏览多维数据集并按 [Date].[Year - Month - Date]
用户定义的层次结构 [Measures].[Applications TD]
时,速度非常慢。
IIF
通常比 CASE
快,而 SUM
通常比 AGGREGATE
.
快
尽管您的主要问题是使用 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]
)
)
我将其作为自定义成员分开:
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")+']')
然后尝试嵌套 IIF
:
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]
)
)
)
但是
如果您将 isToday 列添加到 DimDate,那么与使用 "Today" 成员相比,效率会高得多 - 然后使用该列具有多维数据集日期维度的属性。这样你应该能够简化这个 [Date].[Year - Month - Date].CurrentMember.MemberValue >= [Date].[Date].[All].[Today].MemberValue
我有一个度量的累积总和,其结构如下:
Aggregate (
{ NULL : [Date].[Year - Month - Date].CurrentMember }
,[Measures].[Applications] )
从第一次申请的日期到现在的日期,日期范围内的天数必须是连续的。
然而,日期维度包含从 1900 年 1 月 1 日到未来很长一段时间的日期。
我试图通过按如下方式构建计算的度量来消除第一次申请之前的日期和未来的日期:
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
我试图通过仅在需要的地方聚合来优化它,使用 SCOPE 作为 case 语句的替代方法,利用 EXISTS 和 EXCEPT 函数以及许多其他函数,但都没有成功。
当浏览多维数据集并按 [Date].[Year - Month - Date]
用户定义的层次结构 [Measures].[Applications TD]
时,速度非常慢。
IIF
通常比 CASE
快,而 SUM
通常比 AGGREGATE
.
快
尽管您的主要问题是使用 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]
)
)
我将其作为自定义成员分开:
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")+']')
然后尝试嵌套 IIF
:
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]
)
)
)
但是
如果您将 isToday 列添加到 DimDate,那么与使用 "Today" 成员相比,效率会高得多 - 然后使用该列具有多维数据集日期维度的属性。这样你应该能够简化这个 [Date].[Year - Month - Date].CurrentMember.MemberValue >= [Date].[Date].[All].[Today].MemberValue