DAX連接表系列(四) ⅤAR変量(5)

VAR 變量語法運用(5)

? ?1巢掺、變量作為DAX的篩選

? ? ?先來回顧一下:

?? ?(1)你應(yīng)該還記得,我們在前面的討論中說到:變量能構(gòu)建DAX的外部篩選器。這可能是書寫DAX 最需要的一個功能。比如蒸矛,我們討論過的,使用變量可以擺脫EARLIER函數(shù)的約束胸嘴。而EARLIER可能是 DAX學(xué)習(xí) 中必須要邁過去的一道坎雏掠。

? ? ? ?如果將變量理解為:存在于外部篩選器里被公式引用的計算。那么筛谚,它的含義更像是OUTER --“外部的”磁玉,而不是EARLIER --“更早的”:

Product[ListPriceRankDense] =
VAR??CurrentPrice = Product[Unit Price]
RETURN
COUNTROWS (
FILTER (VALUES ( Product[Unit Price] ),
?Product[Unit Price] > CurrentPrice??) ) + 1

? ? ? ?即便在這個表達式中,你也可以將這里的變量CurrentPrice理解為:它是在篩選器外部單獨計算的驾讲。因此,意思很明顯席赂,它先評估當(dāng)前?Product[Unit Price]--產(chǎn)品的價格(將該列保存為存儲數(shù)據(jù))吮铭,而后在?FILTER篩選器里面引用它,這時候它已經(jīng)是一個按定義得出的結(jié)果值颅停。所以谓晌,在此表達式中不再需要EARLIER。

? ? (2)變量使得復(fù)雜子表達式能被單個計算式替代癞揉,只要存在需要多次計算的相同子表達式時纸肉,使用變量定義該計算式來作為DAX 優(yōu)化器,從而保證計算只發(fā)生一次喊熟,以產(chǎn)生更快的代碼柏肪。

? ? (3)通過前面兩點的復(fù)習(xí),第一芥牌,變量能構(gòu)建篩選器(盡管是外部的)烦味,第二,能使用一個變量替代同一表達式的重復(fù)引用壁拉。我們回憶一下DAX的兩個重要的概念:篩選+計算谬俄。變量能虛擬出需要的行或列篩選柏靶,也就是說,每當(dāng)DAX中需要一個列表篩選時溃论,你就定義一個列表變量指代它屎蜓,同樣,需要一個“當(dāng)前行”行篩選時钥勋,你就定義一個變量來指代它……梆靖。依次類推,直到需要的所有篩選列表都具備時笔诵,再將它們 RETURN 取出來組裝成DAX的篩選返吻。這有利于DAX的步驟思考以及按邏輯簡化公式的復(fù)雜過程。這就是我們前面所說的:

? ? ? ?使用變量的最重要的原因是能按步驟書寫DAX公式乎婿,以及提高公式的可讀性测僵。?為DAX計算的一些中間步驟提供一個變量名稱,這是編寫DAX 代碼的很好的方法谢翎。

? ? 2捍靠、補充與注意事項

? ? ? ?雖然變量存在諸多方面的好處,但使用中也需要注意幾個方面森逮,這在前面也有一點提示(某些情況下不能使用變量---比如需要回到原數(shù)據(jù)列表的計算式)榨婆。

? ? ? (1)補充:VAR在EVALUATE中的應(yīng)用(DAX Studio等取出數(shù)據(jù)的方式)

? ? ? ?可以在EVALUATE語句中定義變量,其語法與用于變量定義的標(biāo)準(zhǔn)語法略有不同褒侧。我們已經(jīng)知道良风,通常使用VAR來定義一個變量,再由RETURN返回后的表達式訪問先前定義的該變量闷供。這樣的標(biāo)準(zhǔn)語法烟央,可以替換DAX中的任何標(biāo)量值或表表達式。
? ? ? ?但是歪脏,當(dāng)編寫EVALUATE語句時疑俭,也是在定義部分中定義一個變量,但不必在之后寫入RETURN:

DEFINE
VAR ExpensiveProducts = FILTER ( Product婿失, Product[Unit Price]> 3000 )
EVALUATE
CALCULATETABLE ( Product钞艇, ExpensiveProducts )

因此,EVALUATE的一個更完整的帶變量的語法定義如下:

? ? ? ?在任何情況下豪硅,只有在EVALUATE之后的表表達式中使用變量時哩照,才會對該變量進行計值,并且計值不依賴于變量定義之后進行的當(dāng)前篩選操作舟误。換句話說葡秒,可以在EVALUATE之后使用VAR / RETURN標(biāo)準(zhǔn)變量語法。
? ? ? ?這不難理解:EVALUATE是直接從數(shù)據(jù)模型里查詢數(shù)據(jù)(先有壓縮數(shù)據(jù)再有存儲數(shù)據(jù)),變量是存儲數(shù)據(jù)眯牧,同時也是數(shù)據(jù)模型的一部分蹋岩。因此,EVALUATE能置于RETURN的前面用以取出變量數(shù)據(jù)学少,反之剪个,則不行)。如下例所示:

EVALUATE
VAR? ExpensiveProducts = FILTER ( Product版确, Product[Unit Price] > 3000 )
RETURN
CALCULATETABLE ( Product扣囊, ExpensiveProducts )

? ?(2)變量的惰性

? ? ? ? 一方面,變量的使用會帶來更有效的公式執(zhí)行绒疗,是因為變量減少了公式引擎和原數(shù)據(jù)之間的“往返”(比如遍歷侵歇、迭代列表。然而吓蘑,變量能直接被公式引擎引用惕虑,即只需請求一次計算)。而且磨镶,變量能作為計算式的公用篩選器溃蔫。

? ? ? ?另一方面,不僅在計算式中使用變量琳猫,如果在 DAX 中查詢數(shù)據(jù)模型(篩選)伟叛,也應(yīng)考慮使用變量來簡化代碼。比如脐嫂,當(dāng)需要使用多個計算語句來獲取多個結(jié)果子集時统刮,還應(yīng)考慮哪些變量可以在多個查詢中被使用…..。
? ? ? ?值得提醒的是雹锣,無論是以上兩個情況的哪一種网沾,在一個或多個計算語句之前,某個定義語句只能出現(xiàn)一次:一個變量可以在一個計算式被反復(fù)引用蕊爵,但一個變量不能存在于多個不同的計算式里(比如在一個度量里的變量,不能用于另外一個度量(其實根本就不會出現(xiàn))桦山,或者在一個計算中攒射,RETURN之后如果還需要引用該變量,則需要重新定義恒水。即變量只存在于當(dāng)前定義下的計算式中)

? ? ? ? 我們通過幾個DAX表達式來加深理解:

? ? ? 下圖中会放,我們定義了兩個在計算式中使用的變量:Date01與Date03,當(dāng)在RETURN之后的計算式里使用它們時钉凌,智能提示里會出現(xiàn)剛剛定義的這兩個變量名咧最,只需雙擊引用即可。

? ? ? ?但是,當(dāng)你在另一個度量(任何其他度量書寫)計算里想再次引用該變量時矢沿,是不會存在Date01與Date03的滥搭。當(dāng)然,最通俗的理解是:變量 ≠ 度量捣鲸。 ?例如, 下面的代碼定義了在兩個不同的CALCULATE語句中用作篩選器的變量 :

DEFINE
VAR Selected_Colors =?FILTER (ALL ( 'Product'[Color] ),
?'Product'[Color] IN { "Purple", "Azure" })?
EVALUATE
CALCULATETABLE (?'Product',??Selected_Colors)

? ? ? ?當(dāng)變量的定義遵循計算語法時瑟匆,其作用區(qū)域僅限于作為計算語句引用的表表達式。下面的示例僅第一個計算語句定義的 SelectedColors 變量有效栽惶,而在其接下來的計算語句中對該變量的引用將失敗 (請參見第10行 )愁溜, 因為該變量不可再次被訪問。

?EVALUATE
VAR Selected_Colors =
FILTER ( ?ALL ( 'Product'[Color] ),
?'Product'[Color] IN { "Purple", "Azure" })
RETURN
CALCULATETABLE (?'Product',?Selected_Colors) ?

EVALUATE
RETURN? ? -- 再次引用
CALCULATETABLE (
VALUES ( 'Product'[Brand] ),??Selected_Colors) – 不起作用

? ? ? ?雖然外厂,我們期望通過?EVALUATE冕象,再次引用?Selected_Colors這個變量,但由于該變量已在第一個?RETURN 后的CALCULATETABLE計算列表里被引用汁蝶,不能再次被引用(只計算一次)渐扮。

? ? ? ?有人把變量的這種一次性的引用計算、更像“常量”的行為稱為:變量的“惰性”穿仪。
? ? ? ?基于此席爽, 你可以在前面的公式中的每個計算語句里分別定義一個變量,如下面的示例所示啊片,變量 SelectColors 被計算兩次(定義了兩次)只锻。

EVALUATE
VAR SelectedColors =
FILTER ( ALL ( 'Product'[Color] ),
? 'Product'[Color] IN { "Purple", "Azure" })
RETURN
CALCULATETABLE ('Product',?SelectedColors)?

?EVALUATE
VAR SelectedColors =
FILTER (ALL ( 'Product'[Color] ),
?'Product'[Color] IN { "Purple", "Azure" })? – 相同的變量被再次定義
RETURN
CALCULATETABLE (
?VALUES ( 'Product'[Brand] ),??SelectedColors)

? ? ? ?前面這個公式中,相同的變量被再次定義使用紫谷。之外齐饮,定義的變量(相同的變量名稱)可以在計算或任何其他 DAX 表達式中被重新定義,其定義的表達式可以相同或不同笤昨。
? ? ? ?在下面的示例中祖驱,第一個計算返回SelectedColors 變量定義的"Purple"紫色或"Azure"天藍色的顏色產(chǎn)品,而第二個計算則使用相同名稱的SelectedColors 變量的另一個定義瞒窒,其中表達式只包括"Red"紅色和"White"白色的顏色產(chǎn)品捺僻。

DEFINE
VAR Selected_Colors =
FILTER (ALL ( 'Product'[Color] ),?'Product'[Color] IN { "Purple", "Azure" })
EVALUATE
CALCULATETABLE (??'Product',?Selected_Colors) ?
EVALUATE
VAR Selected_Colors =
FILTER ( ALL ( 'Product'[Color] ),??'Product'[Color] IN { "Red", "White" })
RETURN
CALCULATETABLE (?'Product',??Selected_Colors)?

我們用更清晰的圖示來表示它:

? ? ? ?在"Power BI" 中,你可以在 "定義" 部分中聲明許多變量崇裁,因此它可以在不同的查詢中重復(fù)使用不同的可視對象的相同名稱的變量匕坯。這些變量通常應(yīng)用于報表中的可視對象展示的篩選器。

未完待續(xù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拔稳,一起剝皮案震驚了整個濱河市葛峻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巴比,老刑警劉巖术奖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件礁遵,死亡現(xiàn)場離奇詭異,居然都是意外死亡采记,警方通過查閱死者的電腦和手機佣耐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挺庞,“玉大人晰赞,你說我怎么就攤上這事⊙∏龋” “怎么了掖鱼?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長援制。 經(jīng)常有香客問我戏挡,道長,這世上最難降的妖魔是什么晨仑? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任褐墅,我火速辦了婚禮,結(jié)果婚禮上洪己,老公的妹妹穿的比我還像新娘妥凳。我一直安慰自己,他們只是感情好答捕,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布逝钥。 她就那樣靜靜地躺著,像睡著了一般拱镐。 火紅的嫁衣襯著肌膚如雪艘款。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天沃琅,我揣著相機與錄音哗咆,去河邊找鬼。 笑死益眉,一個胖子當(dāng)著我的面吹牛晌柬,可吹牛的內(nèi)容都是我干的辙谜。 我是一名探鬼主播跺株,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼圾叼!你這毒婦竟也來了朱庆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闷祥,失蹤者是張志新(化名)和其女友劉穎娱颊,沒想到半個月后傲诵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡箱硕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年拴竹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剧罩。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡栓拜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惠昔,到底是詐尸還是另有隱情幕与,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布镇防,位于F島的核電站啦鸣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏来氧。R本人自食惡果不足惜诫给,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啦扬。 院中可真熱鬧中狂,春花似錦、人聲如沸扑毡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僚楞。三九已至勤晚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泉褐,已是汗流浹背赐写。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膜赃,地道東北人挺邀。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像跳座,于是被迫代替她去往敵國和親端铛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容