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