2012-10-19 68 views
1

我想弄清楚一種方法,可以過濾掉我的多維數據集中的數據,以便我可以執行時間序列計算,例如僅使用該子集的移動平均值。對MDX中的OLAP數據的子集執行計算

例如,讓我們說,我有以下的列的事實表:

  • 大衛·(重點)
  • HourId(密鑰)
  • 價值

我也有具有組合密鑰DayIdHourId的時間維度。這個維度在100天內每小時都有一個關鍵字,所以關鍵字從(1,1)到(100,24)。

在事實表存在於每個時間點的值,所以它看起來像

DayId HourId Value 
1  1  50 
1  2  60 
1  3  75.2 
... ...  ... 
100 23  87 
100 24  89 

現在,假如我想通過在一些任意點來計算,從一開始的時候每天均線當天中午。基本上,我想用除了最後一個點以外的每一天的最後一點來計算平均值,這將在一天中間使用不同的時間點。如果我是做從1天均線至10日,在第10天(HourId 12)中午結束,我會用我的計算中的數據會看起來像:

DayId HourId Value 
1  24  80 
2  24  90 
3  24  39 
4  24  60 
... ... ... 
9  24  10 
10 12  30 

在SQL中,我可以檢索一組這樣很容易地:

SELECT 
    * 
FROM 
    [FactTable] 
WHERE 
    ((DayId BETWEEN 1 AND 9) AND (HourId = 24)) 
    OR ((DayId = 10) AND (HourId = 12)) 

我是很新,OLAP和MDX,所以我真的被用做這種正確的方式掙扎。到目前爲止,我已經能夠做的最好的是在我FROM條款進行分選,而且基本上構造一個元組一套只有我想行:

WITH 
    MEMBER [SMA 10 Value] AS 
    AVG (
     ([Time].[DayId].Lag(9):[Time].[DayId], [Time].[HourId]) 
     , [Value] 
    ) 
SELECT 
    { 
     [Value] 
     , [SMA 10 Value] 
    } ON COLUMNS 
    , ([Time].[DayId], [Time].[HourId]) ON ROWS 
FROM 
(
    SELECT 
     [Measures] ON COLUMNS 
     , { 
      ([Time].[DayId].[1]:[Time].[DayId].[9], [Time].[HourId].[24]) 
      , ([Time].[DayId].[10], [Time].[HourId].[12]) 
    } ON ROWS 
    FROM 
     [Cube] 
) 

但是,它不似乎很適合我的計算。移動平均數在前9天似乎是正確的,因爲它們的元組都具有相同的小時ID,但是當我到達最後一天時,不是使用前面9個元組的值,而是使用前面9個元組的值12小時ID的9天。

我在做什麼錯在這裏,有沒有更好的方法,我可以過濾我的時間維度,以消除我的計算不需要的行?

回答

2

我對MDX有點新,所以拿它值得,但這裏是我的解決方案。

With 
SET [AvgOver] as 
    UNION(
    ({[Time].[DayID].CurrentMember.Lag(9):[Time].[DayID].CurrentMember.Lag(1)}, 
     [Time].[HourID].24) 
    ([Time].[DayID].CurrentMember, [Time].[HourID].CurrentMember) 
) 
MEMBER [SMA 10 Value] as 
    Avg(AvgOver, [Value]) 
Select 
    ([Value], [SMA 10 Value]) on Columns, 
    ([Time].[DayID].[10], [Time].[HourID].[12]) 
From [Cube] 

我把SET結構分解成了一個單獨的塊,因爲這看起來很辛苦。得到這個權利,平均很容易。

你說你想要使用當前選定的數值和前9天的最終數值。對我而言,建議使用UNION函數來將兩個明確定義的集合放在一起。