You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Power Query中基于销售订单(SO #)条件批量应用最早计划日期(Planned Date)及其关联工厂(Factory)信息

当然可以实现,而且效率比自合并高得多!

针对你这个3.5万行的大表场景,分组+合并的组合绝对是比自合并更高效的解决方案,还能完美同步最早计划日期对应的工厂信息。下面是具体的实现步骤和M代码:

核心思路

先按销售订单(SO #)分组,计算每个订单的最早计划日期,并同步提取该日期对应的工厂;再把分组结果和原表合并,将这两个字段批量应用到对应订单的所有行。

具体操作步骤(Power Query可视化界面)

  1. 进入Power Query编辑器,加载你的数据源。
  2. 分组操作:
    • 点击菜单栏的开始→分组依据。
    • 分组列选择SO #。
    • 添加两个聚合列:
      • 第一个列名设为最早计划日期,操作选最小值,列选Planned Date。
      • 第二个列名设为对应工厂,操作选自定义,输入以下公式:
        let minDate = List.Min([Planned Date]) in List.First([Factory]{List.PositionOf([Planned Date], minDate)})
        
    • 点击确定,得到每个SO#对应的最早日期和工厂的汇总表。
  3. 合并原表与分组表:
    • 回到原表(可以通过左侧查询列表切换),点击开始→合并查询→合并查询作为新查询。
    • 原表选择SO #列,分组表也选择SO #列,连接类型选左外部(确保原表所有行都保留)。
  4. 展开合并列:
    • 点击合并列右侧的展开按钮,只勾选最早计划日期和对应工厂,取消勾选“使用原始列名作为前缀”,点击确定。

直接可用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:32:46