Power Query里的"分组依据"按钮主要的功能是对数据进行分类汇总,其原理与Excel中的数据透视表是相似的,但又是不同的。那么不同在哪里呢?它能做到哪些Excel的数据透视表做不到的呢?那就是分组依据在"操作"下拉列表里的"所有行"选项,在这里隐藏着分组依据的强大功能。案例:对于以下这个表格,我们先按照"区域"和"产品"分组对销售数量进行求和,求平均值。假设我们要在原来的分类汇总的基础上,求产品销量最大的日期。这时需要先找出销量最大的记录,然后返回对应的日期,这使用Excel的数据透视表很难实现。我们来在"分组依据"对话框中增加一个新的聚合,在"新列名"文本框中输入"销量最大日期",在"操作"下来列表中选择"所有列",不对表中任何一列进行聚合,操作如下图所示:点击确认后,生成Table类型的列表。点击任何一个Table,会在下方出现可预览的对应表格里的具体内容,如下图所示。接下来找出销售总数列中最大的值,然后返回对应日期。我们需要修改下图红框里的函数。将"each_"修改为each Table.Max(_,"数量")[日期]即可。我们来解析下each Table.Max(_,"数量")[日期]
逐句拆解:each Table.Max(_,"数量")[日期]
先给整体结论:按组分组后,在每组里找出「数量最大」的那一行,再取出这一行的「日期」字段值。
1. 先拆分结构
整句是 Table.Group 里常用的分组聚合表达式拆成三块: each Table.Max(_,"数量") [日期]
2. 逐个解析
① each
each 是 M 语言简写,等价于 (_) =>作用:代表当前分组里的整张子表在 Table.Group 内部,_ 就指代当前这一组的所有行。
② Table.Max(_,"数量")
语法:Table.Max(表, 排序依据列) _:当前组的子表 "数量":按数量这一列做降序取最大值行
功能:在当前分组的所有行里,自动找出「数量数值最大」的那一条完整记录(一整行)。若有多行数量一样都是最大值,取最先出现的那一行。
③ [日期] M 语言中:记录[字段名] = 取出该记录的指定字段值
3. 完整逻辑串起来
each Table.Max(_,"数量")[日期]