DAX:GROUPBY 嵌套聚合

原文:Nested grouping using GROUPBY vs SUMMARIZE

 

GROUPBY函数的作用是根据输入的表进行数据聚合,输入的表可以是表表达式,也就是说,GRUOPBY的参数可以是一个动态查询返回的表,也就是说GROUPBY函数可以用于嵌套聚合的情况。但是,GROUPBY 不会对其添加的任何扩展列执行隐式 CALCULATE,也不允许在GROUPBY函数中执行CALCULATE函数。

GROUPBY 函数在其添加的扩展列中使用 CURRENTGROUP,表达式当前的分组,这使得GROUPBY 通常用于在单个表扫描中执行多个聚合。

GROUPBY (<table> [, <groupBy_columnName> [, <groupBy_columnName> [, …]]] [, <name>, <expression> [, <name>, <expression> [, …]]])

GROUPBY函数引入一个新的函数CURRENTGROUP,且它只能用于在 GROUPBY 函数中定义扩展列的表达式中。实际上,CURRENTGROUP 从 GROUPBY 的表参数中返回一组属于 GROUPBY 结果的当前分组。

举个例子:

[Average Price]是内层GROUPBY函数中定义的一个Measure,外层的GROUPBY函数直接引用,并使用CURRENTGROUP()函数把Measure的计算限制在当前的分组。

EVALUATE
GROUPBY (
    GROUPBY (
        Product,
        'Product Category'[Category],
        'Product Subcategory'[Subcategory],
        "Average Price", AVERAGEX ( CURRENTGROUP() , Product[Unit Price] )
    ),
    'Product Category'[Category],
    "Max SubCat Avg Price", MAXX ( CURRENTGROUP (), [Average Price] )
)

GROUPBY函数主要用于嵌套分组操作,可以在最里面的分组(group)中使用 SUMMARIZE,但必须使用 GROUPBY 才能访问内层分组(inner group)中定义的计算列。

有两点需要注意:

  • 不能在GROUPBY函数中使用CALCULATE函数。 这就以为着,只能使用当前分组的数据进行计算,不能引用已经定义过的Measure。
  • 如果某一行,当参数<expression>计算的结果为空时,GROUPBY 输出的结果会自动删除改行。

 

GROUPBY 函数运行的原理:

  • 第一步:从指定的表(以及关系中“一”这一端的所有相关表)开始。
  • 第二步:使用所有 GroupBy_ColumnName 列(这些列必须存在于步骤 #1 中的表中)创建分组。groupBy_columnName 必须位于表中或相关表中。
  • 第三步:每个组在结果中占一行,但代表原始表中的一组行。
  • 第四步:对于每个组,计算要添加的扩展列。与 SUMMARIZE 函数不同,GROUPBY 函数不会执行隐式 CALCULATE,并且不会将组放入筛选上下文中。

该函数根据一个或多个 groupBy_columnName 列的值将选定的一组行分组为一组摘要行,每个组返回一行。

GROUPBY 主要用于对 DAX 表表达式的中间结果执行聚合。为了对模型中的物理表进行高效聚合,请考虑使用 SUMMARIZECOLUMNS 或 SUMMARIZE 函数。

 

参考稳定:

Nested grouping using GROUPBY vs SUMMARIZE

posted @ 2024-03-21 18:11  悦光阴  阅读(222)  评论(0)    收藏  举报