如何用可扩展M代码按购买订单唯一值创建日期列并设列数限制?
动态生成多列购买日期(Power Query M代码实现)
完整M代码
let // 替换为你的数据源表名 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], // 设置列数上限,可按需修改 MaxColumns = 60, // 自定义函数:生成序数后缀(1→1st, 2→2nd, 3→3rd, 4+→th) GetOrdinalSuffix = (num as number) as text => let mod10 = Number.Mod(num, 10), mod100 = Number.Mod(num, 100), suffix = if mod100 >=11 and mod100 <=13 then "th" else if mod10 =1 then "st" else if mod10 =2 then "nd" else if mod10 =3 then "rd" else "th" in suffix, // 生成规范列名:"1st purchase date", "2nd purchase date"... GenerateColumnName = (num as number) as text => Number.ToText(num) & GetOrdinalSuffix(num) & " purchase date", // 按客户分组,收集各次购买的日期记录 GroupedByCustomer = Table.Group(Source, {"CustomerID"}, { {"PurchaseData", each Record.FromList([PurchaseDate], {GenerateColumnName([PurchaseOrder])}), type record} }), // 筛选不超过上限的订单号,生成目标列列表 AllPurchaseOrders = List.Distinct(Source[PurchaseOrder]), FilteredOrders = List.Select(AllPurchaseOrders, each _ <= MaxColumns), SortedOrders = List.Sort(FilteredOrders), TargetColumns = List.Transform(SortedOrders, GenerateColumnName), // 扩展记录列,生成最终的多列结构 ExpandedColumns = Table.ExpandRecordColumn(GroupedByCustomer, "PurchaseData", TargetColumns, TargetColumns), // 调整列顺序,将客户ID放在最前 ReorderedColumns = Table.ReorderColumns(ExpandedColumns, List.Combine({{"CustomerID"}, TargetColumns})) in ReorderedColumns
代码说明
- 数据源适配:将
Source中的Table1替换为你的实际表名,同时确保CustomerID、PurchaseDate、PurchaseOrder与你的数据列名一致。 - 列数上限控制:修改
MaxColumns的值即可限制生成的列数,超过该值的purchase order会被自动过滤。 - 序数列名自动生成:通过
GetOrdinalSuffix函数自动处理序数后缀,保证列名完全符合「1st purchase date」这类格式要求。 - 动态扩展逻辑:先按客户分组打包购买记录,再基于筛选后的订单号列表动态扩展列,彻底避免手动创建大量列的繁琐操作。
使用步骤
- 打开Power Query编辑器,新建空白查询。
- 粘贴上述代码,修改
Source和列名以匹配你的数据集。 - 调整
MaxColumns到需要的上限值。 - 运行查询即可得到目标结构的表格。
内容的提问来源于stack exchange,提问作者HeadyFinance
相关产品推荐
相关产品推荐

