MDX查询以查找icCube中最后一个非空值

时间:2016-01-20 14:58:16

标签: performance mdx iccube

在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的解决方案。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我们对此解决方案的主要问题是可扩展性,因为我们正在评估{NULL:[Time]。[Time] .currentmember.prevmember} count members。

我认为使用具有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的聚合引擎。我们在这里想要的是一个返回现有最后一天的度量。

这个想法是添加一个以日期作为输入值和max作为聚合方法的度量。然后我们将使用eval - 重要的,因为我们正在缓存子多维数据集 - 使用这个新度量在集合上。

答案 1 :(得分:0)

SSAS使用AdvWrks相对较快。我合并了两个自定义结构(并且需要从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];

结果如下:

enter image description here