3.3 理解FILTER

第3章 使用基本表函數(shù)

理解FILTER

既然我們已經(jīng)介紹了表函數(shù)是什么,那么現(xiàn)在就該全面闡述基本表函數(shù)了。實(shí)際上,通過組合和嵌套基本函數(shù),您已經(jīng)可以計(jì)算出許多強(qiáng)大的表達(dá)式。您學(xué)習(xí)的第一個(gè)函數(shù)能是FILTER

FILTER的語法如下:

FILTER ( <table>, <condition> )

FILTER接收一個(gè)表和一個(gè)邏輯條件作為參數(shù)。結(jié)果,FILTER返回所有滿足條件的行。FILTER同時(shí)是表函數(shù)和迭代函數(shù)。為了返回結(jié)果,它逐行掃描評(píng)估條件的表。換句話說,它對(duì)表進(jìn)行迭代。 例如,以下計(jì)算表返回Fabrikam產(chǎn)品(Fabrikam是品牌)。

FabrikamProducts =
FILTER (
    'Product',
    'Product'[Brand] = "Fabrikam"
)

FILTER通常用于減少迭代中的行數(shù)。例如,如果開發(fā)人員想要計(jì)算紅色產(chǎn)品的銷售量,則他們可以編寫如下度量值:

RedSales :=
SUMX (
    FILTER (
        Sales,
        RELATED ( 'Product'[Color] ) = "Red"
    ),
    Sales[Quantity] * Sales[Net Price]
)

您可以在圖3-2中看到結(jié)果,連同總銷售額。

圖3-2 RedSales僅顯示紅色產(chǎn)品的銷售額

度量值RedSales是在Sales表的子集(即與紅色產(chǎn)品相關(guān)的一組銷售)中進(jìn)行迭代的度量值。FILTER將條件添加到現(xiàn)有條件中。例如,RedSales“音頻”行中顯示既是“音頻”類別又是紅色產(chǎn)品的銷售情況。

可以將FILTER嵌套在另一個(gè)FILTER函數(shù)中。通常,嵌套兩個(gè)FILTER產(chǎn)生的結(jié)果與將兩個(gè)FILTER函數(shù)與AND函數(shù)組合在一起的結(jié)果相同。換句話說,以下兩個(gè)查詢產(chǎn)生相同的結(jié)果:

FabrikamHighMarginProducts =
FILTER (
    FILTER (
        'Product',
        'Product'[Brand] = "Fabrikam"
    ),
    'Product'[Unit Price] > 'Product'[Unit Cost] * 3
)

FabrikamHighMarginProducts =
FILTER (
    'Product',
    AND (
        'Product'[Brand] = "Fabrikam",
        'Product'[Unit Price] > 'Product'[Unit Cost] * 3
    )
)

但是,對(duì)于大表來說,條件的選擇性不同,性能有所不同。如果一個(gè)條件比另一個(gè)條件更具選擇性,則首先使用嵌套FILTER函數(shù)來應(yīng)用最具有選擇性的條件被視為最優(yōu)方法。

例如,如果有很多Fabrikam品牌的產(chǎn)品,但很少有產(chǎn)品的價(jià)格是其成本的三倍,則以下查詢將篩選應(yīng)用于最里面的FILTER中的Unit PriceUnit Cost。這樣,該公式首先應(yīng)用限制性最強(qiáng)的FILTER,以減少檢查品牌所需的迭代次數(shù):

FabrikamHighMarginProducts =
FILTER (
    FILTER (
        'Product',
        'Product'[Unit Price] > 'Product'[Unit Cost] * 3
    ),
    'Product'[Brand] = "Fabrikam"
)

使用FILTER,開發(fā)人員通常可以生成易于閱讀和易于維護(hù)的代碼。例如,假設(shè)您需要計(jì)算紅色產(chǎn)品的數(shù)量。在不使用表函數(shù)的情況下,可能的實(shí)現(xiàn)方式如下:

NumOfRedProducts :=
SUMX (
    'Product',
    IF ( 'Product'[Color] = "Red", 1, 0 )
)

內(nèi)部IF返回取決于產(chǎn)品的顏色是1還是0,并將此表達(dá)式求和將返回紅色產(chǎn)品的數(shù)量。盡管有效,但是此代碼有些棘手。下面是對(duì)相同度量的一個(gè)更好的實(shí)現(xiàn):

NumOfRedProducts :=
COUNTROWS (
    FILTER ( 'Product', 'Product'[Color] = "Red" )
)

后面的表達(dá)式更好地顯示了開發(fā)人員想要獲得的東西。此外,代碼不僅使人更容易閱讀,而且DAX優(yōu)化器還能夠更好地理解開發(fā)人員的意圖。因此,優(yōu)化器產(chǎn)生了更好的查詢計(jì)劃,從而帶來了更好的性能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。