美文网首页
3.3 理解FILTER

3.3 理解FILTER

作者: jweishan | 来源:发表于2020-02-26 14:17 被阅读0次

    第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优化器还能够更好地理解开发人员的意图。因此,优化器产生了更好的查询计划,从而带来了更好的性能。

    相关文章

      网友评论

          本文标题:3.3 理解FILTER

          本文链接:https://www.haomeiwen.com/subject/zmgmchtx.html