我在完成一些我认为在MDX中应该相对简单的事情时遇到了一些麻烦。我想创建一个计算成员,在给定时间点提供前两周我的一项衡量标准的总和。我的时间维度如下:
TimeId TradingDate Day of Week
-----------------------------------
1000 11/1/2012 Thursday
1001 11/2/2012 Friday
1002 11/5/2012 Monday
1003 11/6/2012 Tuesday
... ...
这使得特别困难的是我的时间维度并不完全。我的时间维度的成员只对应于股票市场的交易日,而不是所有时间。这意味着不包括周末,假日或股票市场关闭的任何其他日子。这也意味着遍历时间的常规方法(例如LAG
或PARALLELPERIOD
)在这里不会正常工作。例如,LAG(14)
表示“14个交易日”,在任何给定点都可以表示实际时间的可变长度。
在我的计算成员中,我正在尝试使用FILTER,以便只获得在CurrentMember的前两周内的时间成员。但是,我似乎无法弄清楚正确的语法(如果有的话)来实现这一点。我想它会是这样的:
WITH MEMBER [Sum of Price Previous 2 Weeks] AS
SUM(
FILTER(
[Time].[TimeId].Children
, [Time].[TradingDate].MemberValue
>= VBA!DATEADD("ww", -2, [Time].[TradingDate].CurrentMember.MemberValue)
)
, [Price]
)
然而,这并不是很有效。我似乎无法将计算成员当前迭代的上下文与FILTER
函数内部的单独上下文分开。换句话说,我不知道怎么说:
“迭代
FILTER
内的集合时,比较当前值 每次迭代的成员,对应于CurrentMember的值 计算成员的范围“
我正在努力实现的目标是什么?是否有一种不同的方法可以用来完成我追求的目标?
答案 0 :(得分:2)
您从计算成员获得的结果将取决于查询的轴。首先,请确保您的轴上有[Time].[TradingDate]
。
其次,您的[Time].[TradingDate]
层次结构应按密钥排序(我假设TradingDate
是密钥)。
现在您可以使用此成员定义:
WITH MEMBER [Sum of Price Previous 2 Weeks] AS
SUM(
[Time].[TradingDate].CurrentMember.Lag(14):[Time].[TradingDate].CurrentMember, [Price]
)
答案 1 :(得分:1)
您可以使用set aliases来引用Filter上下文中的外部CurrentMember:
WITH MEMBER [Sum of Price Previous 2 Weeks] AS
SUM(
GENERATE([Time].[TradingDate].CurrentMember AS CurrentDateAlias,
FILTER(
[Time].[TimeId].Children
, [Time].[TradingDate].MemberValue
>= VBA!DATEADD("ww", -2, CurrentDateAlias.Item(0).MemberValue)
)
)
, [Price]
)
GENERATE仅用于在别处定义别名。