如何在Power Query中基于销售订单(SO #)条件批量应用最早计划日期(Planned Date)及其关联工厂(Factory)信息
当然可以实现,而且效率比自合并高得多!
针对你这个3.5万行的大表场景,分组+合并的组合绝对是比自合并更高效的解决方案,还能完美同步最早计划日期对应的工厂信息。下面是具体的实现步骤和M代码:
核心思路
先按销售订单(SO #)分组,计算每个订单的最早计划日期,并同步提取该日期对应的工厂;再把分组结果和原表合并,将这两个字段批量应用到对应订单的所有行。
具体操作步骤(Power Query可视化界面)
- 进入Power Query编辑器,加载你的数据源。
- 分组操作:
- 点击菜单栏的
开始→分组依据。 - 分组列选择
SO #。 - 添加两个聚合列:
- 第一个列名设为
最早计划日期,操作选最小值,列选Planned Date。 - 第二个列名设为
对应工厂,操作选自定义,输入以下公式:let minDate = List.Min([Planned Date]) in List.First([Factory]{List.PositionOf([Planned Date], minDate)})
- 第一个列名设为
- 点击确定,得到每个SO#对应的最早日期和工厂的汇总表。
- 点击菜单栏的
- 合并原表与分组表:
- 回到原表(可以通过左侧查询列表切换),点击
开始→合并查询→合并查询作为新查询。 - 原表选择
SO #列,分组表也选择SO #列,连接类型选左外部(确保原表所有行都保留)。
- 回到原表(可以通过左侧查询列表切换),点击
- 展开合并列:
- 点击合并列右侧的展开按钮,只勾选
最早计划日期和对应工厂,取消勾选“使用原始列名作为前缀”,点击确定。
- 点击合并列右侧的展开按钮,只勾选
直接可用的M代码示例
如果习惯写M代码,可以直接替换源为你的数据源后运行:
let 源 = 你的数据源表, // 按SO#分组,获取每个订单的最早计划日期及对应工厂 分组汇总 = Table.Group(源, {"SO #"}, { {"最早计划日期", each List.Min([Planned Date]), type date}, {"对应工厂", each let 最小日期 = List.Min([Planned Date]), 匹配索引 = List.PositionOf([Planned Date], 最小日期) in [Factory]{匹配索引}, type text } }), // 合并原表和分组结果 合并查询 = Table.NestedJoin(源, {"SO #"}, 分组汇总, {"SO #"}, "分组信息", JoinKind.LeftOuter), // 展开需要的字段 展开字段 = Table.ExpandTableColumn(合并查询, "分组信息", {"最早计划日期", "对应工厂"}, {"最早计划日期", "对应工厂"}) in 展开字段
为什么这个方法更高效?
自合并需要对全表进行两次扫描并做笛卡尔关联,数据量越大耗时越夸张;而分组操作是对每个SO#做局部计算,内存占用和计算量都小得多,3.5万行的表基本能秒出结果。
特殊情况处理(可选)
如果同一个SO#存在多条行的计划日期都是最早值(比如两个工厂同一天都是最早),上面的代码会取第一个出现的工厂。如果需要保留所有符合条件的工厂,可以把对应工厂的自定义公式改成:
List.Select(Table.ToRecords(_), (x) => x[Planned Date] = List.Min([Planned Date]))[Factory]
再用Text.Combine把多个工厂用逗号分隔即可。
内容的提问来源于stack exchange,提问作者XCCH004
相关产品推荐
相关产品推荐

