过滤汇总列

Prz*_*min 5 dax powerbi

如何为函数构造过滤表SUMMARIZECOLUMNS

SUMMARIZECOLUMNS具有以下模式:

SUMMARIZECOLUMNS( 
    ColumnName1, ...
    ColumnNameN,
    FilterTable1,     -- my question concerns this line
    FilterTableN, 
    Name1, [measure1], 
    NameN, [measure2], 
)
Run Code Online (Sandbox Code Playgroud)

我已经检查过以下 3 种模式是否有效。它们返回相同的结果,至少对于我使用的简单示例数据。

SUMMARIZECOLUMNS (
    T[col],
    FILTER( T, T[col] = "red" ) 
)
Run Code Online (Sandbox Code Playgroud)
SUMMARIZECOLUMNS (
    T[col],
    CALCULATETABLE( T, T[col] = "red" ) 
)
Run Code Online (Sandbox Code Playgroud)
SUMMARIZECOLUMNS (
    T[col],
    CALCULATETABLE ( T, KEEPFILTERS ( T[col] = "red" ) )
)
Run Code Online (Sandbox Code Playgroud)

这些模式中的任何一个都优于其他模式吗?

参考:https : //www.sqlbi.com/articles/introducing-summarizecolumns/

更新

我会对包含查询计划分析或可靠来源链接的答案感兴趣。如果您提到在对多个表中的列进行分组时使用 SUMMARIZECOLUMNS 函数,我将不胜感激。

Dav*_*kle 5

您还可以使用 VAR 以 PowerBI 的方式构建它们:

VAR  __MyFilterTable = FILTER( T, T[col] = "red" ) 

RETURN
SUMMARIZECOLUMNS (
    T[col],
    __MyFilterTable
)
Run Code Online (Sandbox Code Playgroud)

哪个更有效取决于过滤的复杂性,因此不一定有“一刀切”规则。对于简单的表级过滤器,只需 FILTER 就足够了。我提醒您,第 1 行(您过滤整个表 T)是一个坏主意。仅过滤单个列的性能要高得多。当您过滤整个表时,DAX 会在内存中具体化整个表,而以下只是具体化 T[col] 的一个值:

VAR  __MyFilterTable = FILTER( ALL(T[col]), T[col] = "red" ) // This is better.

RETURN
SUMMARIZECOLUMNS (
    T[col],
    __MyFilterTable
)
Run Code Online (Sandbox Code Playgroud)

从概念上讲,您甚至可以做得更好。您基本上可以告诉 DAX,“我知道这是一个值,所以甚至不要在表中查找它。只需为我创建一个表并将其视为我过滤了它。像这样:

VAR  __MyFilterTable = TREATAS ({"red"}, T[col] )

RETURN
SUMMARIZECOLUMNS (
    T[col],
    __MyFilterTable
)
Run Code Online (Sandbox Code Playgroud)

同样,这是 PowerBI 在执行其过滤器时使用的模式。

顺便说一句,在顶部创建过滤表与使用 SUMMARIZECOLUMNS() 内联创建它们不会对速度产生任何影响。避免使用 CALCULATETABLE() ,就像您在这里所做的那样。

您也可以这样做,尽管您一般不会看到速度提高:

CALCULATETABLE(
    SUMMARIZECOLUMNS (
        T[col]
    ),
    KEEPFILTERS(T[col] = "red")
)
Run Code Online (Sandbox Code Playgroud)