过去 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];