度量值工作的兩大核心步驟是篩選和計(jì)算,篩選函數(shù)是制定計(jì)算的范圍,聚合函數(shù)的用途是計(jì)算。如果你能夠領(lǐng)悟第一階段學(xué)習(xí)的篩選和聚合共10個(gè)函數(shù)以及上下文的概念,你就掌握了度量值和DAX的精髓。左手漏斗篩選器,右手智能計(jì)算器,隨心所欲的設(shè)計(jì)你的篩選和計(jì)算,Master of Power BI指日可待。這一節(jié)我們就來(lái)學(xué)習(xí)最強(qiáng)大的篩選函數(shù)Filter。

1
Filter 與 Calculate
CALCULATE(<計(jì)算式>,<篩選條件1>,<篩選條件2>…)已經(jīng)有了篩選功能,為什么還要用Filter?這是學(xué)習(xí)Filter時(shí)大多數(shù)人的第一反應(yīng)。其實(shí)Filter才是真正意義的篩選器,其篩選能力遠(yuǎn)大于Calculate附帶的篩選功能,我們常見(jiàn)的篩選利用Calculate完成而不是用Filter,完全是因?yàn)闅㈦u焉用牛刀。就好像求1+1=2,我們沒(méi)有必要用電腦來(lái)計(jì)算。

先說(shuō)說(shuō)Calculate的局限性,在Calculate中的直接篩選條件里我們只能輸入[列]=固定值(<>等運(yùn)算符同樣適用)這種類型的條件。比如求咖啡種類=”拿鐵”, 價(jià)格>30的銷售數(shù)量,寫公式=Calculate([銷售量],[咖啡種類]="拿鐵", [價(jià)格]>30)。
這個(gè)很容易,然而如果我們想要求季度銷售數(shù)量超過(guò)200杯的分店的銷售數(shù)量求和呢?有點(diǎn)不知所措了吧,總結(jié)來(lái)說(shuō),當(dāng)出現(xiàn)如下的類型時(shí),Calculate中的直接篩選就不可用了,這個(gè)時(shí)候我們不得不求助于更強(qiáng)大的Filter函數(shù)。

2
Filter的工作原理
首先我們知道,F(xiàn)ilter不是計(jì)算函數(shù),是篩選函數(shù),返回的結(jié)果是一張表,所以無(wú)法單獨(dú)使用,經(jīng)常與Calculate搭配,也可以直接與某些聚合函數(shù)搭配,比如Countrows(filter(表,篩選條件))來(lái)計(jì)算表行數(shù)。
Filter的語(yǔ)法是很簡(jiǎn)單的,第一部分的表可以是任意一個(gè)表,包括上一節(jié)學(xué)習(xí)的All()函數(shù)返回的表,甚至可以再嵌套一個(gè)Filter返回的表; 第二部分篩選條件是結(jié)果為真或假的表達(dá)式。

Calculate([銷售量],[咖啡種類]="拿鐵", [價(jià)格]>30),這個(gè)公式,我們也可以用Filter來(lái)完成,即Calculate([銷售量],Filter('咖啡數(shù)據(jù)',[咖啡種類]="拿鐵"&&[價(jià)格]>30) (&&表示兩個(gè)條件為AND和的關(guān)系,即需要同時(shí)滿足兩個(gè)條件)。
我們?cè)倩氐角懊娴哪莻€(gè)問(wèn)題,如果想要求季度銷售數(shù)量超過(guò)200杯的分店的銷售數(shù)量,你可能會(huì)想到傳統(tǒng)的Excel分析方式,利用數(shù)據(jù)透視表先找到每個(gè)季度銷量超過(guò)200杯的城市,再去求那些城市的銷售量總計(jì),然而這個(gè)過(guò)程太麻煩,對(duì)于度量值這只是秒秒鐘解決的事情。
現(xiàn)在我們用Filter添加一個(gè)新的度量值[銷售量7] = Calculate([銷售量],filter('區(qū)域負(fù)責(zé)人名單',[銷售量]>200)),得到如下結(jié)果,說(shuō)明從2016年的第2季度開(kāi)始才有超過(guò)200杯銷售量的分店出現(xiàn)。

Filter與我們前面學(xué)習(xí)的9個(gè)函數(shù)不同,它對(duì)所篩選的表進(jìn)行逐行的橫向掃描,針對(duì)每一行循環(huán)地執(zhí)行設(shè)定的篩選程序,我們把這類函數(shù)叫做Iterator, "迭代函數(shù)",后面第三階段將要學(xué)習(xí)的SUMX等帶X類的函數(shù)以及Earlier函數(shù)都屬于迭代函數(shù)。
它們與其他函數(shù)的主要區(qū)別就是在工作的時(shí)候可以意識(shí)到它所指的是哪一行, 我們把這個(gè)工作叫做創(chuàng)造行上下文。
需要注意的是,迭代函數(shù)很強(qiáng)大,但是因?yàn)樗鼜?qiáng)大的計(jì)算能力,我們使用的時(shí)候要格外小心。逐行的運(yùn)算,意味著它們可以觸到表中的最細(xì)的一層顆粒度。
想象以下上面的數(shù)據(jù)例子,如果區(qū)域負(fù)責(zé)人表里有100個(gè)城市,測(cè)算每個(gè)城市的[銷售量]是否>200的計(jì)算就會(huì)分別執(zhí)行100次,再乘以最終輸出表中單元格的數(shù)量。所以如果你篩選的表是在有上百萬(wàn)行的數(shù)據(jù)表中進(jìn)行,這就可能有千萬(wàn)級(jí)億級(jí)次的計(jì)算量,你的電腦可能會(huì)因?yàn)辇嫶蟮挠?jì)算量而吃力。所以在使用Filter這個(gè)函數(shù)時(shí)有兩個(gè)特別囑咐:
1. 盡量在Lookup表,而不在數(shù)據(jù)表。(同我們使用的數(shù)據(jù)例子,區(qū)域負(fù)責(zé)人名單的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)小于咖啡數(shù)據(jù)表的量)
2. 當(dāng)Calculate的直接篩選功能可以完成工作時(shí),一定不要用Filter。前面提到Calculate的篩選條件只能執(zhí)行[列]=固定值這一類的計(jì)算,當(dāng)應(yīng)對(duì)這一類篩選運(yùn)算時(shí),簡(jiǎn)單的Calculate運(yùn)算起來(lái)最快。殺雞焉用牛刀,只有當(dāng)Calculate自己搞不定的時(shí)候,我們?cè)儆肅alculate+Filter的方法。








暫無(wú)數(shù)據(jù)