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

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

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

在使用?SELECTCOLUMNS?取出元素的時(shí)候,將該列的元素進(jìn)行了計(jì)算,那么雖然元素沒(méi)有變化,但計(jì)算結(jié)果就不再一樣了,如下:

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

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

Power BI 終極系列課程《BI真經(jīng)》

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