2011-03-13 52 views
0

我想知道如何創建一個計算出的度量,該度量僅在事實表中生成唯一事實的計數。我的事實表基本上是從歷史的角度存儲事件。但我需要採取措施來濾除冗餘事件。
以銷售額爲例(由於OLAP周圍的所有材料總是使用銷售額作爲示例):

事實表存儲銷售活動。首次銷售時,它有一個獨特的銷售參考,它是事實表中的一列。然而,一個獨特的銷售可以修改(項目添加或返回)或完全取消。事實表將這些更改存儲爲不同的行。


如果我使用SSAS創建計數度量,我會計算所有銷售事件的數量,這意味着對於對其進行的每次更改(在某些報告中都希望這樣做),獨特銷售將被多次計數。不過,我也想要一種能夠產生獨特銷售數量而非事件數量的衡量標準,而不僅僅是基於統計獨特的銷售參考。如果用戶按日期過濾,則他們應該看到在該日期仍然存在的唯一銷售(如果銷售在該日期被取消,則根本不應在計數中表示)。

只計算在某些單元格上聚合的度量

如何在MDX/SSAS中執行此操作?看起來好像我需要從查詢中找到基於時間維度的銷售的最新更改的子集中的計數查詢工作。 在SQL它會是這樣的:

SELECT COUNT(*) FROM SalesFacts FACT1 WHERE Event <> 'Cancelled' AND
Timestamp = (SELECT MAX(Timestamp) FROM SalesFact FACT2 WHERE FACT1.SalesRef=FACT2.SalesRef)

是否有可能或事件高性能有子查詢的MDX?

+0

順便說一句,這不是在SQL做計數的性能方法。 eventID的明確計數(特別是如果被索引的話)會好得多。或'Row_number over ...'類型的方法。上述情況將會導致數據量大增。 – piers7 2011-03-24 08:49:23

回答

0

在SSAS中,創建基於唯一事務標識(銷售編號或訂單編號)的度量,然後在屬性窗口中將該度量設置爲「DistinctCount」聚合函數。

現在它應該計算不同的訂貨號,在它發現自己的任何尺寸切片下。

0

張貼的查詢可能可能會被改寫這樣的:

SELECT COUNT(DISTINCT SalesRef) 
FROM SalesFacts 
WHERE Event <> 'Cancelled' 
0

一個簡單的答案是隻是在你實際上視圖/ DSV查詢「銷售數量」一欄,對於一個「初始供應1 '事件,對事件的所有子部分修訂爲零,如果事件被取消,則爲-1。這種「日記」方法與增量事實表加載很好地結合在一起。

從長遠來看,另一種可能更有用的方法是創建一個事件維度:然後,您可以公開一個計算出的度量值,該度量值是您事實上給定度量上非維度空間中該維度的成員數量表。然而,對於銷售來說,這實質上是一個退化的維度(基於事實表的維度),可能會變得非常大。這可能不合適。

有時需求可能會更復雜。如果按時間劃分,你是否需要知道存在的所有不同事件然後,即使它們後來被取消了?這開始變得棘手:有克里斯·韋伯的博客最近的文章中,他談到了一個(微毛)解決方案:

http://cwebbbi.wordpress.com/2011/01/22/solving-the-events-in-progress-problem-in-mdx-part-2role-playing-measure-groups/

相關問題