我想弄清楚一種方法,可以過濾掉我的多維數據集中的數據,以便我可以執行時間序列計算,例如僅使用該子集的移動平均值。對MDX中的OLAP數據的子集執行計算
例如,讓我們說,我有以下的列的事實表:
- 大衛·(重點)
- HourId(密鑰)
- 價值
我也有具有組合密鑰DayId和HourId的時間維度。這個維度在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天。
我在做什麼錯在這裏,有沒有更好的方法,我可以過濾我的時間維度,以消除我的計算不需要的行?