Ssas

MDX 中不存在 SQL 的等價物(或尋找另一種方法來完成相同的結果)

  • March 15, 2018

我正在嘗試幫助承包商在多維 SSAS 2017 中實現多維數據集,並且在 MDX 方面沒有太多經驗。

我有一個看起來像這樣的表:

在此處輸入圖像描述

目標是僅在查詢中包含[seq]每個組合[Part][CustomerID]PersonID應用過濾器後具有最低值的行,然後對 value 列求和。因此,如果未應用過濾器,則應僅返回第 1 行和第 3 行,並且 value 列的總和應為 2。但如果使用者僅過濾 6 月份的數據,則應僅返回第 2 行和第 3 行,並且總和值列的值應為 1。

我們在 SQL 中是這樣完成的:

SELECT SUM(Value) 
FROM (SELECT * 
,ROW_NUMBER() OVER (PARTITION BY CustomerID,PersonID, Part ORDER BY SEQ asc) AS Seq
FROM Table WHERE DATEKeY BETWEEN @StartDate AND @EndDate
)A
WHERE Seq=1;

但是承包商在 MDX 等級函式的性能方面存在很大問題。在 MDX 方面沒有太多經驗,我很難知道有哪些替代方案會表現良好,並且承包商沒有提供任何符合我們業務需求的替代方案。

我想出的另一種方法是:

SELECT SUM(Value) 
FROM [Table]  AS A
WHERE DATEKey BETWEEN @StartDate AND @ENDDate 
AND CustomerID=@CustomerID 
AND NOT EXISTS(SELECT 1 FROM Table AS B 
               WHERE B.Part=A.Part
                 AND B.CustomerID=@CustomerID
                 AND B.PersonID=A.PersonID
                 AND B.SEQ<A.SEQ)

這實際上比 SQL 中的舊方法執行得更好,但我不知道如何在 MDX 中實現此方法、以前的方法或等效邏輯,以實現良好的性能。

我知道如果不查看整個多維數據集,MDX 將很難做到,但虛假程式碼或只是一些關於哪些函式將為該邏輯提供最佳性能的建議將是一個很大的幫助。

正如您所說,沒有實際的多維數據集很難嘗試,這在一定程度上取決於您的尺寸的佈局方式,但我認為如果您在seq.

BottomCount(Set_Expression, 計數

$$ ,Numeric_Expression $$)

您的 set_expression 可能是您關心的維度之間的交叉連接,您可以基於該表達式創建動態集。

類似的東西

WITH DYNAMIC SET LowestSeq AS
BottomCount({Part.Members * Customer.Members * Person.Members})
  , 1  
  , [Measures].[seq])

如果您在 pastebin 或其他東西上將您的場景的小型複制發佈為 XMLA 腳本,這將有所幫助。如果您的 dsv 基於生成數據的命名查詢,我們可以輕鬆地在我們的機器上創建相同的多維數據集。

我的建議是不要嘗試在 MDX 中執行序列邏輯。你會對性能感到失望。我會推薦以下方法:

首先創建一個視圖(如果您願意,也可以創建一個物理表),它每天為每個元件/客戶/人返回一行,顯示目前有效值。視圖看起來像這樣:

select x.PersonID, x.Part, x.CustomerID, x.Value, d.DateKey
from (
   select *
   ,LEAD(x.DateKey,1,100000000) OVER (PARTITION BY CustomerID,PersonID, Part ORDER BY SEQ asc)-1 as EndDateKey
   from YourTable x
) x
join DimDate d on d.DateKey between x.DateKey and x.EndDateKey
where d.[Date] < getdate()

接下來,將該新視圖載入為多維數據集中的度量值組。不要使用 Sum 度量,而是使用具有 AggregateFunction=FirstChild 的 Value 列上的度量。這將導致 2018 年 2 月的總數反映 2018 年 2 月 1 日生效的行。

FirstChild 是一種半加法度量,它會導致它返回所選日期範圍內的第一個成員。我建議您閱讀這篇文,以確保正確標記日期維度,以便它能夠正常工作。

與直覺相反,即使您正在爆炸數據量,這種方法在多維數據集中也會表現得更好,因為所有艱苦的工作都是在多維數據集處理期間完成的,而在查詢期間它只會顯示正確的數據日期。

如果您遵循我的建議,請計算一下您最終將獲得多少行。希望它是合理數量的行(例如,100,000,000 或更少,或者如果您有良好的硬體,則為 10 億或更多)。如果行數不合理(例如 100,000,000,000),那麼還有其他選項,例如多對多日期範圍維度,實現起來要復雜得多。除非我的建議不合適,否則我不會推薦這種方法。

引用自:https://dba.stackexchange.com/questions/200027