【问题标题】:MDX Query to find the last ever non empty value in icCubeMDX 查询以查找 icCube 中最后一个非空值
【发布时间】:2016-04-26 11:54:11
【问题描述】:

根据 Chris Web 的 post,我正在寻找一种快速查找客户最后一次购买的方法。

我使用如下 MDX 语句:

WITH FUNCTION previous_buys() AS tail( nonempty({NULL:[Time].[Time].currentmember.prevmember} ,[measures].[sales amt]),1)
MEMBER [last buy] as previous_buys().(0).key

select [measures].[last buy] on 0
,      [Customers].[Customers].[name].members on 1
from [Store Sales]
where [Time].[Time].[day].&[2015-12-20T00:00:00.000]

这符合预期,但需要很长时间。有没有一种简单的方法可以以某种方式加速这个查询。由于 icCube 与 Microsoft MDX 有些不同,我不能只是复制 Chris Web 的解决方案。

有什么想法吗?

【问题讨论】:

    标签: performance mdx iccube


    【解决方案1】:

    此解决方案面临的主要问题是可扩展性,因为我们正在评估 {NULL:[Time].[Time].currentmember.prevmember} 计数成员。

    我认为使用带有 Head 函数的 Reverse 不会评估整个集合,但 Empty 函数的当前实现会“物化”集合。这意味着我们正在评估所有成员。还不是一个有效的解决方案。

    另一个更优雅的解决方案是使用递归函数。这将大大减少被评估的成员数量。

    WITH 
      FUNCTION previous_buys(t_) AS IIF( (t_,[Measures].[Amount]) = NULL,  previous_buys(t_.prevMember), t_ )
      MEMBER [last buy] as previous_buys( [Time].[Calendar].current).name
    
    SELECT 
      [measures].[last buy] on 0,
      [Customers].[Geography].[Region]  on 1
    FROM [Sales]
    WHERE [Time].[Calendar].[Year].[2006].[Q1 2006].[Jan 2006].[8 Jan 2006]
    

    如果您有很多空日期,则可能会使算法复杂一些,降低到一个月的水平来检查空日期。这将在一次迭代中评估整个月,而不是我们在白天版本中的 30/31。


    最后也是最快一个数量级的依赖于icCube的聚合引擎。我们需要的是返回最后一个存在日期的度量。

    这个想法是添加一个以日期作为输入值并以最大值作为聚合方法的度量。然后我们将使用 eval - 在我们缓存子立方体时很重要 - 在这个新度量的集合上。

    【讨论】:

      【解决方案2】:

      使用SSASAdvWrks 相对较快。我合并了两个自定义结构(并且需要从 FUNCTION 更改,因为我认为这不是 MS 对 mdx 的实现的一部分):

      WITH 
        MEMBER [Measures].[previous_buys] AS 
          Tail
          (
            NonEmpty
            (
              {NULL : [Date].[Calendar].CurrentMember.PrevMember}
             ,[Measures].[Internet Sales Amount]
            )
          ).Item(0).Item(0).Member_Key 
      SELECT 
        NON EMPTY 
          [Measures].[previous_buys] ON 0
       ,NON EMPTY 
          [Product].[Product Categories].[Product] ON 1
      FROM [Adventure Works]
      WHERE 
        [Date].[Calendar].[Date].&[20071015];
      

      结果如下:

      【讨论】:

      • FUNCTION 是一种在 icCube 中创建可重用代码的方法,非常方便,因为您可以在模式级别声明它。
      • whyteq,在我们的演示模式上也需要亚秒级 ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多