3.3 理解FILTER

第3章 使用基本表函数

理解FILTER

既然我们已经介绍了表函数是什么,那么现在就该全面阐述基本表函数了。实际上,通过组合和嵌套基本函数,您已经可以计算出许多强大的表达式。您学习的第一个函数能是FILTER

FILTER的语法如下:

FILTER ( <table>, <condition> )

FILTER接收一个表和一个逻辑条件作为参数。结果,FILTER返回所有满足条件的行。FILTER同时是表函数和迭代函数。为了返回结果,它逐行扫描评估条件的表。换句话说,它对表进行迭代。 例如,以下计算表返回Fabrikam产品(Fabrikam是品牌)。

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

FILTER通常用于减少迭代中的行数。例如,如果开发人员想要计算红色产品的销售量,则他们可以编写如下度量值:

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

您可以在图3-2中看到结果,连同总销售额。

图3-2 RedSales仅显示红色产品的销售额

度量值RedSales是在Sales表的子集(即与红色产品相关的一组销售)中进行迭代的度量值。FILTER将条件添加到现有条件中。例如,RedSales“音频”行中显示既是“音频”类别又是红色产品的销售情况。

可以将FILTER嵌套在另一个FILTER函数中。通常,嵌套两个FILTER产生的结果与将两个FILTER函数与AND函数组合在一起的结果相同。换句话说,以下两个查询产生相同的结果:

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
    )
)

但是,对于大表来说,条件的选择性不同,性能有所不同。如果一个条件比另一个条件更具选择性,则首先使用嵌套FILTER函数来应用最具有选择性的条件被视为最优方法。

例如,如果有很多Fabrikam品牌的产品,但很少有产品的价格是其成本的三倍,则以下查询将筛选应用于最里面的FILTER中的Unit PriceUnit Cost。这样,该公式首先应用限制性最强的FILTER,以减少检查品牌所需的迭代次数:

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

使用FILTER,开发人员通常可以生成易于阅读和易于维护的代码。例如,假设您需要计算红色产品的数量。在不使用表函数的情况下,可能的实现方式如下:

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

内部IF返回取决于产品的颜色是1还是0,并将此表达式求和将返回红色产品的数量。尽管有效,但是此代码有些棘手。下面是对相同度量的一个更好的实现:

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

后面的表达式更好地显示了开发人员想要获得的东西。此外,代码不仅使人更容易阅读,而且DAX优化器还能够更好地理解开发人员的意图。因此,优化器产生了更好的查询计划,从而带来了更好的性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容