如何为函数构造过滤表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 函数,我将不胜感激。
您还可以使用 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)
| 归档时间: |
|
| 查看次数: |
1995 次 |
| 最近记录: |