1

我在完成一些我认为在 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
...       ...

让这件事变得特别困难的是,我的时间维度还不够完整。我的时间维度的成员只对应股票市场的交易日,而不是所有时间。这意味着不包括周末、节假日或股市休市的任何其他日子。这也意味着穿越时间的常规方法,例如LAGorPARALLELPERIOD不会在这里完全起作用。 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 的值进行比较”

我正在努力实现的目标是可能的吗?我可以采取不同的方法来完成我所追求的目标吗?

4

2 回答 2

2

您可以使用设置别名来引用 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 仅用于在某处定义别名。

于 2012-12-06T21:26:53.653 回答
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]
    )
于 2012-12-04T17:23:54.453 回答