DAX 过滤器上下文
DAX Filter context
我想知道这两个 DAX 表达式之间有什么区别,每个 return 我需要什么:
(1) =calculate([PctMkt], FILTER ( ALL ( BondDim), BondDim[Quality] = "HY" ))
(2) =calculate([PctMkt], ALL(BondDim), BondDim[Quality] = "HY" )
DAX 引擎是否使这两个表达式等价? (2) 只是 (1) 的缩写吗?另外, (1) 会计算得更快吗?试图通过“破解”计算的度量来确保我不会在枢轴 table 中造成问题。这些措施允许用户向下钻取到较低的粒度,同时在数据透视 table.
的上下文中保留较高级别的数据
第二个
CALCULATE (
[PctMkt],
ALL ( BondDim ),
BondDim[Quality] = "HY"
)
被DAX内部展开为等价公式
CALCULATE (
[PctMkt],
ALL ( BondDim ),
FILTER (
ALL ( BondDim[Quality] ),
BondDim[Quality] = "HY"
)
)
所以和第一个不一样
CALCULATE (
[PctMkt],
FILTER (
ALL ( BondDim ),
BondDim[Quality] = "HY"
)
)
区别在于第一个使用整个 BondDim table 作为过滤器,而第二个仅使用相同 table
的一列
一个更简单的类似问题是众所周知的。
CALCULATE (
[PctMkt],
BondDim[Quality] = "HY"
)
is the shortened equivalent of
CALCULATE (
[PctMkt],
FILTER (
ALL ( BondDim[Quality] ),
BondDim[Quality] = "HY"
)
)
您的公式需要多加考虑。
当 ALL 用作 CALCULATE 的参数时,它仅删除过滤器(如 REMOVEFILTERS)而不是作为 table 表达式。
当ALL ( < table > )
作为FILTER的参数时,必然是table表达式。
我给出的第一个 link 给出了一个详细的例子,说明这种区别如何产生重要的区别。我将在这里提供另一个示例:
假设 MarketDim
与来自 ID
列的 BondDim
具有一对多关系(并且 不是 双向关系)每个和 table 如下:
BondDim MarketDim
Quality ID ID Pct
------------- ----------
HY 1 1 5%
VY 1 2 10%
XY 2 3 20%
假设[PctMkt] := MAX ( MarketDim[Pct] )
然后,在您的第一个公式 (1)
中,FILTER 参数如下 table:
Quality ID
-------------
HY 1
因此,(1)
的结果只能是5%
(或空白),因为ID = 1
是唯一的选择。
在您的第二个公式 (2)
中,没有 table 个参数,因为 ALL ( BondDim )
仅删除过滤器,而 BondDim[Quality] = "HY"
仅作用于单个列。没有 table 参数,因为 MarketDim
过滤器 BondDim
但反之则不然(因为它是单向关系),这些列过滤器参数对我定义的度量没有任何影响(不过,它可能取决于您的实际尺寸)。
因此,(2)
的结果与 CALCULATE ( [PctMkt] )
相同,它将是 20%
,除非对 MarketDim
进行过滤以排除 ID = 3
].
注意:如果 [PctMkt]
对 BondDim
列或由 BondDim
你的模型。 IE。过滤器在关系中传播“下游”而不是“上游”。
我想知道这两个 DAX 表达式之间有什么区别,每个 return 我需要什么:
(1) =calculate([PctMkt], FILTER ( ALL ( BondDim), BondDim[Quality] = "HY" ))
(2) =calculate([PctMkt], ALL(BondDim), BondDim[Quality] = "HY" )
DAX 引擎是否使这两个表达式等价? (2) 只是 (1) 的缩写吗?另外, (1) 会计算得更快吗?试图通过“破解”计算的度量来确保我不会在枢轴 table 中造成问题。这些措施允许用户向下钻取到较低的粒度,同时在数据透视 table.
的上下文中保留较高级别的数据第二个
CALCULATE (
[PctMkt],
ALL ( BondDim ),
BondDim[Quality] = "HY"
)
被DAX内部展开为等价公式
CALCULATE (
[PctMkt],
ALL ( BondDim ),
FILTER (
ALL ( BondDim[Quality] ),
BondDim[Quality] = "HY"
)
)
所以和第一个不一样
CALCULATE (
[PctMkt],
FILTER (
ALL ( BondDim ),
BondDim[Quality] = "HY"
)
)
区别在于第一个使用整个 BondDim table 作为过滤器,而第二个仅使用相同 table
的一列一个更简单的类似问题是众所周知的。
CALCULATE (
[PctMkt],
BondDim[Quality] = "HY"
)
is the shortened equivalent of
CALCULATE (
[PctMkt],
FILTER (
ALL ( BondDim[Quality] ),
BondDim[Quality] = "HY"
)
)
您的公式需要多加考虑。
当 ALL 用作 CALCULATE 的参数时,它仅删除过滤器(如 REMOVEFILTERS)而不是作为 table 表达式。
当ALL ( < table > )
作为FILTER的参数时,必然是table表达式。
我给出的第一个 link 给出了一个详细的例子,说明这种区别如何产生重要的区别。我将在这里提供另一个示例:
假设 MarketDim
与来自 ID
列的 BondDim
具有一对多关系(并且 不是 双向关系)每个和 table 如下:
BondDim MarketDim
Quality ID ID Pct
------------- ----------
HY 1 1 5%
VY 1 2 10%
XY 2 3 20%
假设[PctMkt] := MAX ( MarketDim[Pct] )
然后,在您的第一个公式 (1)
中,FILTER 参数如下 table:
Quality ID
-------------
HY 1
因此,(1)
的结果只能是5%
(或空白),因为ID = 1
是唯一的选择。
在您的第二个公式 (2)
中,没有 table 个参数,因为 ALL ( BondDim )
仅删除过滤器,而 BondDim[Quality] = "HY"
仅作用于单个列。没有 table 参数,因为 MarketDim
过滤器 BondDim
但反之则不然(因为它是单向关系),这些列过滤器参数对我定义的度量没有任何影响(不过,它可能取决于您的实际尺寸)。
因此,(2)
的结果与 CALCULATE ( [PctMkt] )
相同,它将是 20%
,除非对 MarketDim
进行过滤以排除 ID = 3
].
注意:如果 [PctMkt]
对 BondDim
列或由 BondDim
你的模型。 IE。过滤器在关系中传播“下游”而不是“上游”。