2016-01-20 80 views
5

繼Chris Web的post後,我正在尋找一種快速的方法來找到客戶的最後一次購買。MDX查詢找到icCube中最後一個非空的值

我用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

我們將使用此解決方案的主要問題是可伸縮性,因爲我們正在評估{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 - 這是我們緩存子多維數據集時的重要因素 - 使用這種新度量的集合。

+0

感謝這個解決方案。它已經幫助了很多! – Arthur

0

這是相對較快使用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]; 

這將導致以下:

enter image description here

+0

FUNCTION是一種在icCube中創建可重用代碼的方法,方便您在模式級別聲明它。 – ic3

+0

whyteq,在我們的演示模式上也花費了亞秒級;-) – ic3

相關問題