一直对Table.Partition()很好奇,也完全不知道它是干嘛的。
直到看到雷公子这篇文章《PowerQuery分表函数简单应用Table.Partition(分表)》。作者给出了一个应用案例,但是对该函数用法没有做详细解释。
于是继续爬网,找到了施阳大神的《Table.Partition》。施阳在这个帖子中对此函数用法做了一系列解释。畅心大神在回复中做了提醒。施阳提到了此函数第四个参数是一个hash函数,理解它的关键是它对第三个函数进行了Mod运算(求余)。
那么,什么是hash函数呢?施阳大神帖子下面withsilence提到了SQL。我猜也是来自于SQL,虽然我不懂SQL。
于是再爬网,找到《MySQL HASH分区》。作者详细解释了SQL中hash分区的法则,提到了:
常规hash是基于分区个数的取模(%)运算。根据余数(将对应的记录)插入到指定的分区。
这样一来就很清楚了:PowerQuery中,Table.Partition()函数的第四个参数是对第三个参数(也就是返回的表格的个数)进行取模运算。
再回到雷公子和施阳大神的例子。雷公子的例子很好理解——一般返回表格的个数可以从对索引列的计算得到。施阳大神举的不太好理解的例子,如果把列a作为索引列,也就很好理解了。
那么,Table.Partition()函数的第三个参数是否必须是个数字而不能是函数呢?其实不是。它只要是一个能返回数字的函数就行。雷公子的例子中的
= Table.Partition(被用整数除的列, "索引", List.Max(被用整数除的列[索引],1)+1, each _)
很好地解释了这一点。而Chris Webb大神的《Creating Histograms With Power Query》也对此函数及其第三个参数做了简要说明。并且他还给出了利用该函数构造直方图的用法。
这个函数和Table.Group()函数有什么区别呢?目前我还没找到特别大的区别。结合雷公子给的例子,我写了一个Table.Group()函数的版本:
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
更改的类型 = Table.TransformColumnTypes(源,{{"列1", type text}, {"列2", type any}, {"列3", type any}, {"列4", type any}, {"列5", type any}, {"列6", type any}, {"列7", type any}, {"列8", type datetime}, {"列9", type any}, {"列10", type any}, {"列11", type any}, {"列12", type any}, {"列13", type any}, {"列14", type any}, {"列15", type datetime}, {"列16", type any}, {"列17", type any}, {"列18", type any}, {"列19", type any}, {"列20", type any}, {"列21", type any}, {"列22", type datetime}, {"列23", type any}, {"列24", type any}, {"列25", type any}, {"列26", type any}, {"列27", type any}, {"列28", type any}, {"列29", type datetime}, {"列30", type any}, {"列31", type any}, {"列32", type any}}),
已添加索引 = Table.AddIndexColumn(更改的类型, "索引", 1, 1),
重排序的列 = Table.ReorderColumns(已添加索引,{"索引", "列1", "列2", "列3", "列4", "列5", "列6", "列7", "列8", "列9", "列10", "列11", "列12", "列13", "列14", "列15", "列16", "列17", "列18", "列19", "列20", "列21", "列22", "列23", "列24", "列25", "列26", "列27", "列28", "列29", "列30", "列31", "列32"}),
被用整数除的列 = Table.TransformColumns(重排序的列, {{"索引", each Number.IntegerDivide(_-1, 6)+1, Int64.Type}}),
分组的行 = Table.Group(被用整数除的列, {"索引"}, {{"计数", each Table.RowCount(_), type number}, {"all", each _, type table}}),
删除的其他列1 = Table.TransformColumns(分组的行,{"all",each Table.Transpose(Table.RemoveColumns(_,{"索引"}))}),
删除的其他列2 = Table.SelectColumns(删除的其他列1,{"all","索引"}),
自定义1 = Table.TransformColumns(删除的其他列2,{"all",Table.PromoteHeaders}),
已添加自定义 = Table.AddColumn(自定义1, "班级", each Table.ColumnNames([all]){0}),
自定义2 = Table.TransformColumns(已添加自定义,{"all",each Table.RenameColumns(_,{Table.ColumnNames(_){0},"日产量"})}),
删除的其他列 = Table.SelectColumns(自定义2,{"班级", "all"}),
#"展开的“all”" = Table.ExpandTableColumn(删除的其他列, "all", {"日产量", "产量(单人)", "应出勤人数", "实出勤人数", "工作时间(小时)", "UPPH"}, {"日产量", "产量(单人)", "应出勤人数", "实出勤人数", "工作时间(小时)", "UPPH"})
in
#"展开的“all”"
雷公子案例文件下载:链接: https://pan.baidu.com/s/1dGzeCEX 密码: 4bkd