过去 24 个月的移动平均线
Moving Average of Last 24 months
我有这个计算成员,它计算过去 12 个月的移动平均值:
iif(IsEmpty(Sum({[Time].[Month].CurrentMember:NULL},
[Measures].[Count])), NULL,
Avg
(
[Time].[Month].CurrentMember.Lag(11) :
[Time].[Month].CurrentMember,
[Measures].[Count]
))
iif 条件已经到位,因为我不想获得未来几个月的值(没有值),没有它我确实得到了。
我想做的是仅对自上一个非空月以来的最后 24 个月进行此度量。
我试过 Tail 和 Lag,但没有成功(我会 post 我在这里尝试,但在多次尝试后我删除了它们,真的不知道从哪里开始)。
感谢@whytheq,这是我使用的最终解决方案:
CREATE DYNAMIC SET CURRENTCUBE.[FirstEmptyMonth]
AS { Tail
(
NonEmpty
(
[Time].[Month].MEMBERS
,[Measures].[Count]
)
,1
).Item(0).NextMember };
CREATE DYNAMIC SET CURRENTCUBE.[MonthsToIgnore]
AS {[FirstEmptyMonth].Item(0) : NULL}
+
{NULL : [FirstEmptyMonth].Item(0).Lag(25)} ;
CREATE MEMBER CURRENTCUBE.[Measures].[Moving Average]
AS IIF
(
Intersect({[Time].[Month].CurrentMember},[MonthsToIgnore]).Count = 1
,null
,Avg
(
[Time].[Month].CurrentMember.Lag(11) : [Time].[Month].CurrentMember
,[Measures].[Count]
)
);
在 AdvWrks
我得到了这个:
WITH
SET [FutureMonthsWithNoData] AS
{
Tail
(
NonEmpty
(
[Date].[Calendar].[Month].MEMBERS
,[Measures].[Internet Sales Amount]
)
,1
).Item(0).NextMember
: NULL
}
MEMBER [Measures].[blah] AS
IIF
(
Intersect
(
{[Date].[Calendar].CurrentMember}
,[FutureMonthsWithNoData]
).Count
= 1
,null
,1
)
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[blah]
} ON 0
,[Date].[Calendar].[Month].MEMBERS ON 1
FROM [Adventure Works];
它returns这个:
所以我要说的是,您可以创建这个 FutureDatesWithNoData
的初始集,然后使用该集在您的脚本中创建一个条件。该集合将(我认为)在您的立方体中是这样的:
SET [FutureMonthsWithNoData] AS
{
Tail
(
NonEmpty
(
[Time].[Month].[Month].MEMBERS
,[Measures].[Count]
)
,1
).Item(0).NextMember
: NULL
}
你的衡量标准如下:
IIF
(
Intersect
(
{[Time].[Month].CurrentMember}
,[FutureMonthsWithNoData]
).Count
= 1
,NULL
,Avg
(
[Time].[Month].CurrentMember.Lag(11) : [Time].[Month].CurrentMember
,[Measures].[Count]
)
)
如果您还想排除 24 个月前的月份,则此脚本总结了逻辑:
WITH
SET [FistEmptyMonth] AS
{
Tail
(
NonEmpty
(
[Date].[Calendar].[Month].MEMBERS
,[Measures].[Internet Sales Amount]
)
,1
).Item(0).NextMember
}
SET [MonthsToIgnore] AS
{[FistEmptyMonth].Item(0) : NULL}
+
{NULL : [FistEmptyMonth].Item(0).Lag(24)}
MEMBER [Measures].[blah] AS
IIF
(
Intersect({[Date].[Calendar].CurrentMember},[MonthsToIgnore]).Count = 1
,null
,1
)
SELECT
{[Measures].[Internet Sales Amount]} ON 0
,[Date].[Calendar].[Month].MEMBERS ON 1
FROM [Adventure Works];
我有这个计算成员,它计算过去 12 个月的移动平均值:
iif(IsEmpty(Sum({[Time].[Month].CurrentMember:NULL},
[Measures].[Count])), NULL,
Avg
(
[Time].[Month].CurrentMember.Lag(11) :
[Time].[Month].CurrentMember,
[Measures].[Count]
))
iif 条件已经到位,因为我不想获得未来几个月的值(没有值),没有它我确实得到了。
我想做的是仅对自上一个非空月以来的最后 24 个月进行此度量。
我试过 Tail 和 Lag,但没有成功(我会 post 我在这里尝试,但在多次尝试后我删除了它们,真的不知道从哪里开始)。
感谢@whytheq,这是我使用的最终解决方案:
CREATE DYNAMIC SET CURRENTCUBE.[FirstEmptyMonth]
AS { Tail
(
NonEmpty
(
[Time].[Month].MEMBERS
,[Measures].[Count]
)
,1
).Item(0).NextMember };
CREATE DYNAMIC SET CURRENTCUBE.[MonthsToIgnore]
AS {[FirstEmptyMonth].Item(0) : NULL}
+
{NULL : [FirstEmptyMonth].Item(0).Lag(25)} ;
CREATE MEMBER CURRENTCUBE.[Measures].[Moving Average]
AS IIF
(
Intersect({[Time].[Month].CurrentMember},[MonthsToIgnore]).Count = 1
,null
,Avg
(
[Time].[Month].CurrentMember.Lag(11) : [Time].[Month].CurrentMember
,[Measures].[Count]
)
);
在 AdvWrks
我得到了这个:
WITH
SET [FutureMonthsWithNoData] AS
{
Tail
(
NonEmpty
(
[Date].[Calendar].[Month].MEMBERS
,[Measures].[Internet Sales Amount]
)
,1
).Item(0).NextMember
: NULL
}
MEMBER [Measures].[blah] AS
IIF
(
Intersect
(
{[Date].[Calendar].CurrentMember}
,[FutureMonthsWithNoData]
).Count
= 1
,null
,1
)
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[blah]
} ON 0
,[Date].[Calendar].[Month].MEMBERS ON 1
FROM [Adventure Works];
它returns这个:
所以我要说的是,您可以创建这个 FutureDatesWithNoData
的初始集,然后使用该集在您的脚本中创建一个条件。该集合将(我认为)在您的立方体中是这样的:
SET [FutureMonthsWithNoData] AS
{
Tail
(
NonEmpty
(
[Time].[Month].[Month].MEMBERS
,[Measures].[Count]
)
,1
).Item(0).NextMember
: NULL
}
你的衡量标准如下:
IIF
(
Intersect
(
{[Time].[Month].CurrentMember}
,[FutureMonthsWithNoData]
).Count
= 1
,NULL
,Avg
(
[Time].[Month].CurrentMember.Lag(11) : [Time].[Month].CurrentMember
,[Measures].[Count]
)
)
如果您还想排除 24 个月前的月份,则此脚本总结了逻辑:
WITH
SET [FistEmptyMonth] AS
{
Tail
(
NonEmpty
(
[Date].[Calendar].[Month].MEMBERS
,[Measures].[Internet Sales Amount]
)
,1
).Item(0).NextMember
}
SET [MonthsToIgnore] AS
{[FistEmptyMonth].Item(0) : NULL}
+
{NULL : [FistEmptyMonth].Item(0).Lag(24)}
MEMBER [Measures].[blah] AS
IIF
(
Intersect({[Date].[Calendar].CurrentMember},[MonthsToIgnore]).Count = 1
,null
,1
)
SELECT
{[Measures].[Internet Sales Amount]} ON 0
,[Date].[Calendar].[Month].MEMBERS ON 1
FROM [Adventure Works];