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

Power BI中如何通过M查询基于ID分组首末记录创建新变量

Power BI M查询实现分组首尾行特殊赋值方案

核心逻辑:你之前的写法无法生效是因为M查询没有直接获取当前行所属分组首尾行的内置属性,需要先标记每个分组内的行序号,再判断是否为首/尾行后赋值。

实现步骤

  • 步骤1:为原始表添加全局索引列,保证原始行顺序不被分组操作打乱
  • 步骤2:按pkBookingItemID字段分组,分组操作选择保留所有行
  • 步骤3:为每个分组内的行添加组内序号、组内行数两个标记字段
  • 步骤4:展开分组表,根据组内序号判断是否为首尾行,计算两个新字段

完整M代码示例

let
    // 替换这里的"你的原始表"为你自己的数据源引用
    源 = 你的原始表,
    // 添加全局索引保证原始顺序不丢失
    添加全局索引 = Table.AddIndexColumn(源, "全局索引", 0, 1, Int64.Type),
    // 按pkBookingItemID分组
    分组 = Table.Group(添加全局索引, {"pkBookingItemID"}, {{"组内所有行", each _, type table [pkBookingItemID=number, StartTime=time, EndTime=time, BusinessStartTime=time, BusinessEndTime=time, 全局索引=number]}}),
    // 为每个分组添加组内行号、组内总行数标记
    添加组内标记 = Table.TransformColumns(分组, {"组内所有行", (t) => 
        let
            加行号 = Table.AddIndexColumn(t, "组内行号", 1, 1, Int64.Type),
            总行数 = Table.RowCount(加行号),
            加总行数标记 = Table.AddColumn(加行号, "组内总行数", each 总行数, Int64.Type)
        in
            加总行数标记
    }),
    // 展开分组的所有行
    展开分组 = Table.ExpandTableColumn(添加组内标记, "组内所有行", {"StartTime", "EndTime", "BusinessStartTime", "BusinessEndTime", "全局索引", "组内行号", "组内总行数"}),
    // 按全局索引排序恢复原始表顺序
    恢复原始顺序 = Table.Sort(展开分组,{{"全局索引", Order.Ascending}}),
    // 计算New_BusinessStartTime
    添加新开始时间 = Table.AddColumn(恢复原始顺序, "New_BusinessStartTime", each if [组内行号] = 1 then [StartTime] else [BusinessStartTime], type time),
    // 计算New_BusinessEndTime
    添加新结束时间 = Table.AddColumn(添加新开始时间, "New_BusinessEndTime", each if [组内行号] = [组内总行数] then [EndTime] else [BusinessEndTime], type time),
    // 移除不需要的辅助列
    清理辅助列 = Table.RemoveColumns(添加新结束时间,{"全局索引", "组内行号", "组内总行数"})
in
    清理辅助列

注意事项

  • 如果你的时间字段是文本类型而非time类型,代码里的类型声明可以对应修改为text,不影响逻辑运行
  • 如果原始表已经有可保证分组内顺序的唯一排序字段,可以省略全局索引的步骤,直接用已有字段排序即可

内容的提问来源于stack exchange,提问作者Deepak Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:24:01