如何在Power Query(M语言)中实现连续发票号的分组区间统计?
Power Query(M语言)解决连续发票号分组(间隙与孤岛问题)
针对你要处理的连续发票号按客户分组的需求,直接用M语言按以下步骤实现:
步骤说明
- 转换数据类型:确保
发票号列是数值类型,避免排序出错 - 分组并排序:按
客户编号分组,在每个客户组内对发票号升序排序 - 添加组内索引:给每个客户组内的行添加从0开始的索引列
- 计算分组标识:用
发票号减去索引值,相同的结果代表属于同一连续发票段 - 最终分组聚合:按
客户编号和分组标识分组,取每组的最小/最大发票号作为起始/结束号
完整M代码
假设你的源数据查询名为源,替换成你实际的查询名即可:
let // 1. 确保发票号为数值类型 转换类型 = Table.TransformColumnTypes(源, {{"发票号", Int64.Type}}), // 2. 按客户编号分组,组内对发票号排序 分组客户 = Table.Group(转换类型, {"客户编号"}, {{"组内数据", each Table.Sort(_, {{"发票号", Order.Ascending}})}}), // 3. 给每个组内的行添加索引(从0开始) 添加组内索引 = Table.TransformColumns(分组客户, {{"组内数据", each Table.AddIndexColumn(_, "组内索引", 0, 1)}}), // 4. 展开组内数据,计算分组标识(发票号 - 组内索引) 展开数据 = Table.ExpandTableColumn(添加组内索引, "组内数据", {"发票号", "组内索引"}, {"发票号", "组内索引"}), 计算分组标识 = Table.AddColumn(展开数据, "分组标识", each [发票号] - [组内索引]), // 5. 按客户编号和分组标识分组,聚合起始/结束发票号 最终分组 = Table.Group(计算分组标识, {"客户编号", "分组标识"}, { {"起始发票号", each List.Min([发票号])}, {"结束发票号", each List.Max([发票号])} }), // 移除不需要的分组标识列,调整列顺序 整理结果 = Table.ReorderColumns(Table.RemoveColumns(最终分组, {"分组标识"}), {"起始发票号", "结束发票号", "客户编号"}) in 整理结果
验证结果
运行上述代码后,会得到你需要的输出格式:
| 起始发票号 | 结束发票号 | 客户编号 |
|---|---|---|
| 1 | 2 | A |
| 3 | 3 | B |
| 4 | 5 | A |
| 6 | 7 | B |
内容的提问来源于stack exchange,提问作者Solo
相关产品推荐
相关产品推荐

