在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的解决方案。
有什么想法吗?
答案 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];
结果如下: