Table of Contents

代码操作 DI006 (改进) 将多列筛选拆分为多个筛选条件

说明

当使用一个筛选表达式,并通过 AND (或等效的 && 运算符) 将多个列条件组合在一起时,通常为每一列分别指定一个筛选条件能获得更好的性能。

示例

更改:

CALCULATE([Total Sales], Products[Color] = "Red" && Products[Class] = "High-end")

改为:

CALCULATE([Total Sales], Products[Color] = "Red", Products[Class] = "High-end")

为什么 Tabular Editor 会建议这样做?

在内部,标量谓词会被转换为一个表表达式,该表达式使用 FILTER 函数并带有指定的条件。 该表达式生成的表中,筛选表达式中涉及的每一列都会对应生成一列。 即。:

Products[Color] = "Red" && Products[Class] = "High-end"

会变为:

FILTER(ALL(Products[Color], Products[Class]), Products[Color] = "Red" && Products[Class] = "High-end")

ALL 函数在传入多个列参数时,会返回一张表,其中包含这些列的所有唯一组合。 然后,这张表会按指定条件进行筛选,筛选结果会应用到 CALCULATECALCULATETABLE 函数的筛选语境中。

不过,当筛选条件中的所有操作数都通过 AND 组合时,把它们拆分成独立的筛选会更高效。 这样就不必创建一张包含各列所有唯一组合的大表,而是创建多个更小的表:每张表只包含一列,并且只保留满足筛选条件的该列唯一值。 这可以显著提升性能,尤其是在列的基数很高且相关性较低时。