篩選上下文是DAX中上下文類型的其中之一,另外一種是行上下文蟀悦,本節(jié)媚朦,我們會學(xué)習(xí)什么是行上下文,它如何工作日戈。
這里询张,我們用另外一個函數(shù)來作為例子:
Sales[GrossMargin] = Sales[SalesAmount] - Sales[TotalCost]
通常我們在計算列中,會這樣來書寫表達式浙炼,用來計算gross margin(毛利潤)份氧。一旦你在計算列中定義了這個函數(shù),我們就會得到如下的結(jié)果表:
DAX對表格的每行都進行了計算弯屈,每行的值都是不同的蜗帜,這個和我們設(shè)想的一致。為了理解行上下文资厉,我們要對函數(shù)咬文嚼字一下:函數(shù)中厅缺,我們要求對兩列相減,但是我們有告訴函數(shù)使用列中的哪兩行來計算減法嗎宴偿?你會說其所使用的行是默認的湘捎。因為它是個計算列,DAX逐行的計算窄刘,對于每行窥妇,它都得到一個不同的結(jié)果。這個是對的娩践,但是活翩,從DAX表達式的角度來看,使用哪一行作為計算的依據(jù)欺矫,還是不確定的纱新。
事實上,使用哪一行作為計算的依據(jù)并不是存儲在函數(shù)中穆趴。它是由另外一種上下文決定的:行上下文脸爱。當你定義了一個計算列,DAX啟動了一個迭代器未妹,從表格的第一行開始簿废。對于每行空入,都產(chǎn)生一個行上下文用于計算結(jié)果。逐行都是這樣的方式族檬,如果有1百萬行歪赢,你可以認為這樣的計算邏輯會重復(fù)1百萬次。不過单料,DAX有其內(nèi)在的優(yōu)化處理埋凯,并不是這樣簡單的重復(fù),否則的話扫尖,DAX會是一個非常緩慢的計算引擎白对,但是從理解的邏輯上看,可以這樣去理解换怖。
更準確的定義行上下文甩恼,它總是包含了一個行,DAX在創(chuàng)建計算列的時候會自動生成沉颂。你還可以使用其他的技術(shù)來生成行上下文条摸,這個后面我們會討論,但是要簡單的去解釋行上下文铸屉,就是通過計算列钉蒲。
兩種上下文
現(xiàn)在,你已經(jīng)學(xué)習(xí)了什么是行上下文抬探,什么是篩選上下文子巾。DAX中只有這兩種上下文。因此小压,只有它們才能改變計算的結(jié)果线梗。任何計算公式都是在這兩種上下文環(huán)境下計算的。
這兩種上下文使得不同的單元格怠益,即使使用相同的函數(shù)仪搔,也會得到不同的結(jié)果。
下面這點對于初學(xué)者非常重要蜻牢,也比較難以理解透徹:實際應(yīng)用中烤咧,計算的結(jié)果通常是在這兩種上下文同時作用的情況下計算出來的。本書到現(xiàn)在抢呆,你可能覺的這個很好理解煮嫌。目前,也許你是對的抱虐。但是在本書接下去的內(nèi)容中昌阿,你會發(fā)現(xiàn)有的函數(shù),如果你沒有意識到兩種上下文的同時存在且同時作用,你會對結(jié)果難以理解懦冰。