如何理解 DAX 數(shù)據(jù)沿襲
數(shù)據(jù)沿襲,這個詞匯,相當生僻,很多小伙伴都問這個什么意思,以及如何去使用他。那本文就來幫大家理解這個事物。
數(shù)據(jù)沿襲
數(shù)據(jù)沿襲(data lineage),表示數(shù)據(jù)的一種本質聯(lián)系。
舉一個例子,如下:

在?SUMX?進行計算的時候,問題來了:
vTable,是一個孤立的表嗎?
vTable,是一個與原數(shù)據(jù)模型實際保持關聯(lián)的表數(shù)據(jù)嗎?
從?SUMX?的計算結果來看,這的確是總計結果。
這說明,在針對 vTable 進行計算時候,進行的上下文轉換,的確由于篩選上下文對模型有實際的影響,這說明:
雖然 vTable 是通過 VAR 獨立構建的,但它依然保持著在實際數(shù)據(jù)模型中的數(shù)據(jù)血緣關系。
進一步的案例
如果剛剛的案例沒能讓你覺得有什么特別,那么請看這個例子:
DataLineage.Demo =
VAR vTable = SELECTCOLUMNS( DISTINCT( 'Product'[Category] ) , "Item" , 'Product'[Category] )
RETURN SUMX( vTable , [KPI] )現(xiàn)在,用 VAR 構建的 vTable 的過程是:
第一步,先計算?DISTINCT( 'Product'[Category]?得到一個過程中的表;
第二步,再通過?SELECTCOLUMNS?取出上述過程表的?'Product'[Category]?列,并更名為:Item;
第三步,針對這個 vTable 計算度量值后求和。
我們看看最后的結果:

可以看出,與此前的結果是一致的。
也就是說,不管我們在中間的計算過程再增加多少過程,如果其本質只是針對數(shù)據(jù)模型中的列的獲取,那都不會改變數(shù)據(jù)模型本身,也就不會改變計算過程中數(shù)據(jù)與數(shù)據(jù)模型的聯(lián)系。
一個反例
當然,我們需要一個反例來更好的理解這個數(shù)據(jù)沿襲,如下:
DataLineage.Error =
VAR vTable = SELECTCOLUMNS( DISTINCT( 'Product'[Category] ) , "Item" , 'Product'[Category] & "" )
RETURN SUMX( vTable , [KPI] )這里的區(qū)別在于:

在使用?SELECTCOLUMNS?取出元素的時候,將該列的元素進行了計算,那么雖然元素沒有變化,但計算結果就不再一樣了,如下:

由于沒有了數(shù)據(jù)沿襲,在計算 SUMX 的時候,vTable 有 3 行,由于其山下文轉換沒有了數(shù)據(jù)沿襲的存在,不再構成對數(shù)據(jù)模型的聯(lián)系,也就不會篩選數(shù)據(jù)模型,進而導致總的結果是普通計算結果的 3 倍。
進一步實驗
從剛才的反例可以看出,如果破壞了列的元素,就會丟失數(shù)據(jù)沿襲。
還可以再做一個更仔細的實驗,如下:
DataLineage.Error2 =
VAR vTable =
SELECTCOLUMNS(
DISTINCT( 'Product'[Category] ) ,
"Item" , IF( 'Product'[Category] = "家具" , 'Product'[Category] & "" , 'Product'[Category] )
)
RETURN SUMX( vTable , [KPI] )這個實驗的特點是,僅僅針對某個元素進行破壞數(shù)據(jù)沿襲的計算,而其他元素保持不變,那么可以還會部分保持數(shù)據(jù)沿襲嗎?
神奇的效果出現(xiàn)了:
也就是說,如果某行的計算并非獲取原始元素,而進行了計算;而其他元素直接獲取原始元素,在這種情況下,是否可以部分保持數(shù)據(jù)沿襲?
請在留言區(qū)寫下你的看法和你的理解吧。
當然,你可以自己完成這個實驗里知道這個結果是什么。
數(shù)據(jù)沿襲有什么用
數(shù)據(jù)沿襲,其本質是一種非常自然的存在。請大家考慮一個經典的帕累托積累 % 計算問題,如下:

針對這條積累 % 的計算曲線,考慮以下 DAX 公式:
ABC.KPI.Cumulate% =
VAR vCurrentValue = [KPI.Sales]
VAR vItemList = ALLSELECTED( 'Model_產品'[產品子類別] )
VAR vItems =
FILTER(
vItemList , [KPI.Sales] >= vCurrentValue
)
RETURN CALCULATE( [KPI.Sales], vItems ) / CALCULATE( [KPI.Sales] , ALLSELECTED( 'Model_產品'[產品子類別] ) )其中,vItemList = ALLSELECTED( 'Model_產品'[產品子類別] )?已經將數(shù)據(jù)模型的某列進行了暫存,而進一步對其進行計算,得到 vItems,更重要的是在最后的計算中,vItems 作為 CALCULATE 的篩選參數(shù)是否可以起到篩選的作用呢,畢竟 vItems 已經經過了四次轉換:
第一次,ALLSELECTED ('Model_產品 '[產品子類別] );
第二次,賦給 vItemList;
第三次,F(xiàn)ILTER;
第四次,vItems。
在四次轉換后所得到的 vItems,即使你理解了上述的數(shù)據(jù)沿襲的概念,但此時你可以意識到以下兩個重要的知識嗎?
【重要知識】即使經過多達 4 次,且包括取出,暫存,過濾等操作,依然會保持數(shù)據(jù)沿襲,與原有數(shù)據(jù)模型有關系。
【重要啟發(fā)】可以通過數(shù)據(jù)沿襲的特性構建邏輯清晰但形式多步復雜的計算流程,由于數(shù)據(jù)沿襲,整個計算流程完全自然與數(shù)據(jù)模型打通。
上述的?ABC.KPI.Cumulate% ?的計算邏輯是正確的,而且,這正反應了這兩點重要的知識。
結論
數(shù)據(jù)沿襲,表面是一個晦澀的概念,但其實它是數(shù)據(jù)模型在計算中的自然演化,保持對數(shù)據(jù)模型的聯(lián)系。
注意:這里用了 “聯(lián)系” 二字,而沒有用 “關系” 二字。請你理解我們想強調的以及避免的混淆。
另外,在理解了數(shù)據(jù)沿襲的知識后,我們通過上述的【重要啟發(fā)】構建很多復雜的計算而邏輯清晰,這篇文章就是為了后續(xù)的內容做的引子。有了數(shù)據(jù)沿襲,我們就可以設計出一些通用的模式,在隨后的文章中會和大家分享。
最后,請你猜猜:上述 DataLineage.Error2 的計算會不會保持部分數(shù)據(jù)沿襲?請你在留言區(qū)寫出你的想法吧。
在訂閱了BI佐羅講授的《BI真經》之《BI進行時》課程區(qū),除了可以下載本文案例,還可以觀看視頻講解。

Power BI 終極系列課程《BI真經》

BI真經 - 讓數(shù)據(jù)真正成為你的力量
掃碼與精英一起討論 Power BI,驗證碼:data2021
點擊“閱讀原文”進入學習中心
↙
