Ssas 非空的上一个值-MDX

Ssas 非空的上一个值-MDX,ssas,mdx,sharepoint-2013,dimension,performancepoint,Ssas,Mdx,Sharepoint 2013,Dimension,Performancepoint,我正在使用Performance Point Dashboard Designer 2013和SharePoint Server 2013构建仪表板。我使用SSAS2012作为多维数据集 我有一个类似于下图所示的场景。我需要查找以前的非空值,以便查找趋势 衡量标准:[配额] 维度:[日期].[日历日期].[日期] 脚本([Measures].[Quota],[Date].[Calendar Date].PrevMember)提供了以前的日期。假设2013年1月27日的配额值为87,则返回201

我正在使用Performance Point Dashboard Designer 2013和SharePoint Server 2013构建仪表板。我使用SSAS2012作为多维数据集

我有一个类似于下图所示的场景。我需要查找以前的非空值,以便查找趋势

衡量标准:[配额]

维度:[日期].[日历日期].[日期]

脚本
([Measures].[Quota],[Date].[Calendar Date].PrevMember)
提供了以前的日期。假设2013年1月27日的配额值为87,则返回2013年1月26日的值为空。我希望它返回13年1月21日,有一些配额值。对于2013年1月21日,我想返回2013年1月15日

我想知道这是否可能

谢谢,

Merin

您可以使用递归来定义它

以下查询为AdventureWorks多维数据集提供了类似的内容:

WITH member [Measures].[Prev non empty] AS
            IIf(IsEmpty(([Date].[Calendar].CurrentMember.PrevMember, [Measures].[Internet Sales Amount])),
                ([Date].[Calendar].CurrentMember.PrevMember, [Measures].[Prev non empty]),
                ([Date].[Calendar].CurrentMember.PrevMember, [Measures].[Internet Sales Amount])
               ), format_String = '$#,##0.00'

SELECT {[Measures].[Internet Sales Amount], [Measures].[Prev non empty]}
       ON COLUMNS,
       non empty
       Descendants([Date].[Calendar].[Month].&[2007]&[12], [Date].[Calendar].[Date])
       ON ROWS
FROM [Adventure Works]
WHERE [Customer].[Customer].&[12650]

您必须替换日期层次结构的名称,以及在度量值的递归定义中从
Internet Sales Amount
Quota
的度量值名称
Prev non empty

经过长时间的搜索、点击和试用等,我想我为自己发明了一个解决方案

以下是我的计算成员的脚本

(
 [Quota],
 Tail
  (
   Nonempty
   ( LastPeriods(15, [Date].[Calendar Date].PrevMember)
    ,[Quota]
   )
  ).Item(0)
)
(
 [Quota],
 Tail
  (
   Nonempty
   ( LastPeriods(15, [Date].[Calendar Date].PrevMember)
    ,[Quota]
   )
  ).Item(0)
)
解释

  • 数字15意味着它将查找多达15个兄弟的非空度量值
  • 现在我们知道最多有多少个兄弟姐妹要穿越回去,在这个例子中是15个
  • 让我们查找15个以前的同级(空和非空),不包括当前成员

    (LastPeriods(15,[日期][日历日期].PrevMember)

  • 由于它将同时生成空成员和非空成员,因此让我们根据度量值[Quota]筛选出空成员。如果我们不在此处指定度量值,它将使用默认度量值,无论它是什么,我们可能无法获得所需的结果

    非空(最后期限(15,[日期][日历日期].PrevMember),[配额])

  • 输出中可能有多个成员。我们将选择最后一个

    尾巴 ( 非空 (LastPeriods(15,[日期][日历日期].PrevMember) ,[配额] ) )

  • 到目前为止,上面的脚本提供了以前的非空成员。现在我们希望为度量值[Quota]实现此成员

  • 因此,下面的脚本可以创建计算成员

    (
     [Quota],
     Tail
      (
       Nonempty
       ( LastPeriods(15, [Date].[Calendar Date].PrevMember)
        ,[Quota]
       )
      ).Item(0)
    )
    
    (
     [Quota],
     Tail
      (
       Nonempty
       ( LastPeriods(15, [Date].[Calendar Date].PrevMember)
        ,[Quota]
       )
      ).Item(0)
    )
    

    谢谢FrankPI。我会让你知道它是如何进行的。嗨,Frank。我还有一个问题。我有一个从1985年到2015年的日期维度。这太多的日期了。我只有五个日期的度量值。所以这个查询花了大约3分钟来产生结果。我们能做些什么让递归函数只遍历到非空的dat吗,而不是遍历所有日期。谢谢!@MerinNakarmi一个解决方案是将此计算移动到多维数据集处理,这样当您访问度量值时,度量值将立即可用:而不是仅加载五个日期的
    配额
    ,您可以使其适用于所有日期,例如,通过从中读取t的视图包含此度量值的事实表。我试图使用您的想法在多维数据集中创建一个计算成员,但不幸的是,它不起作用。可能我写错了。我会再试一次。谢谢FrankPI。@MerinNakarmi将计算移到多维数据集中的一个计算成员将不会有多大帮助,因为计算脚本中定义的内容在查询时重新评估。我的建议是将流程移动到数据加载时间,这在AnalysisServices术语中称为“处理”。