FILTER 应该在 SUMMARIZE 内部还是外部使用?

Posted

技术标签:

【中文标题】FILTER 应该在 SUMMARIZE 内部还是外部使用?【英文标题】:Should FILTER be used inside or outside of SUMMARIZE? 【发布时间】:2018-06-30 09:37:18 【问题描述】:

我有这两个问题:

EVALUATE
FILTER (
    SUMMARIZE (
        'Sales',
        Products[ProductName],
        'Calendar'[CalendarYear],
        "Total Sales Amount", SUM ( Sales[SalesAmount] ),
        "Total Cost", SUM ( 'Sales'[TotalProductCost] )
    ),
    Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

还有这个:

EVALUATE
SUMMARIZE (
    FILTER ( 'Sales', RELATED ( Products[ProductName] ) = "AWC Logo Cap" ),
    Products[ProductName],
    'Calendar'[CalendarYear],
    "Total Sales Amount", SUM ( Sales[SalesAmount] ),
    "Total Cost", SUM ( 'Sales'[TotalProductCost] )
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

两者都返回以下内容:

这两个查询的唯一区别是 FILTER 函数的定位——这是更好的做法,为什么?


注意

因此,查看 Alex 引用的两篇 sqlbi 文章,我们可以执行以下任一操作以提高性能,但我仍然不确定 FILTER 函数应该发生在其他语法内部还是外部:

EVALUATE
FILTER (
    ADDCOLUMNS (
        SUMMARIZE ( 'Sales', Products[ProductName], 'Calendar'[CalendarYear] ),
        "Total Sales Amount", CALCULATE ( SUM ( Sales[SalesAmount] ) ),
        "Total Cost", CALCULATE ( SUM ( 'Sales'[TotalProductCost] ) )
    ),
    Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

并使用“SUMMARIZECOLUMNS”函数:

EVALUATE
FILTER (
    SUMMARIZECOLUMNS (
        Products[ProductName],
        'Calendar'[CalendarYear],
        "Total Sales Amount", SUM ( Sales[SalesAmount] ),
        "Total Cost", SUM ( 'Sales'[TotalProductCost] )
    ),
    Products[ProductName] = "AWC Logo Cap"
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

注2

看起来 SUMMARIZECOLUMNS 有一个内置的 FILTER 参数,所以我猜这是防止性能问题的最佳方法:

EVALUATE
SUMMARIZECOLUMNS (
    Products[ProductName],
    'Calendar'[CalendarYear],
    FILTER ( 'Products', Products[ProductName] = "AWC Logo Cap" ),
    "Total Sales Amount", SUM ( Sales[SalesAmount] ),
    "Total Cost", SUM ( 'Sales'[TotalProductCost] )
)
ORDER BY
    Products[ProductName],
    'Calendar'[CalendarYear] ASC

【问题讨论】:

您可能对各种过滤 SUMMARIZECOLUMNS 的方式感兴趣:***.com/q/59931193/1903793 【参考方案1】:

在您提供的两个选项中,我怀疑后者的计算效率可能更高。但是,两者都不是“最佳实践”。

根据Best Practices Using SUMMARIZE and ADDCOLUMNS on sqlbi.com,

您应该始终支持 ADDCOLUMNS 版本。经验法则是,您永远不应使用 SUMMARIZE 添加扩展列,除非由于以下至少一种情况而需要它:

您想对一个或多个分组列使用 ROLLUP 以获得小计

您在扩展列中使用了重要的表表达式,您将在本文后面的“SUMMARIZE 和 ADDCOLUMNS 中的过滤上下文”部分中看到

还请查看他们在SUMMARIZECOLUMNS 上的文章,该文章在大多数用例中推荐了较新的功能。

【讨论】:

非常好的答案,我会将这些更好的做法添加到问题中。 hmmm ...但即使接受这些文章,我仍然不确定我们是否在内部或外部具有 FILTER 功能? @whytheq 就我个人而言,如果我担心性能,我会将FILTER 放在SUMMARIZESUMMARIZECOLUMNS 的内部。我的理由是FILTER 是一个迭代器,将它放在外面需要构建一个更大的表,然后将其过滤到一个ProductName,而不是一开始就构建较小的表。我将编辑 DAX 的外观。 (编辑:没关系,你的note2是我建议的。)

以上是关于FILTER 应该在 SUMMARIZE 内部还是外部使用?的主要内容,如果未能解决你的问题,请参考以下文章

在summarize()中使用group_by()的语法[关闭]

“使用”应该在命名空间内部还是外部? [复制]

变量应该在循环内部还是外部声明? [复制]

return 语句应该在锁的内部还是外部?

'using'指令应该在命名空间的内部还是外部?

在 android studio java 代码中在哪里声明视图?声明应该在 onCreate 函数外部还是内部完成