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

Power Query技术咨询:仅拥有StartingDate时如何生成每行的EndingDate

在Power Query中生成EndingDate的实现方案

需求:为每行生成EndingDate,规则为同编号分组内,当前行的EndingDate等于下一行的StartingDate减去1天,分组内最后一行的EndingDate留空。

示例数据与预期结果

编号供应商起始日期(StartingDate)成本预期结果(结束日期EndingDate)
1300002023/1/11002023/1/13
1300002023/1/141052023/1/27
1300002023/1/28110
2300002023/1/11102023/1/17
2300002023/1/181162023/1/29
2300002023/1/30120
3300002023/1/1902023/1/5
3300002023/1/61002023/1/8
3300002023/1/9105

实现步骤

前置准备

先确保起始日期(StartingDate)列是日期类型,若不是,选中列后点击转换>数据类型>日期完成转换。同时按编号和起始日期升序排序,保证组内日期顺序正确。

方法1:分组处理(适合复杂分组场景)

  1. 分组数据:点击开始>分组依据,设置分组依据为编号,新列名设为组数据,操作选择所有行,确认后生成分组表。
  2. 添加EndingDate列:点击添加列>自定义列,输入以下M代码:
    Table.AddColumn([组数据], "EndingDate", (row) => 
        let
            currentPos = Table.PositionOf([组数据], row),
            nextDate = try [组数据]{currentPos + 1}[起始日期(StartingDate)] otherwise null
        in
            if nextDate <> null then Date.AddDays(nextDate, -1) else null
    )
    
  3. 展开分组:点击组数据列右侧的展开按钮,勾选所有需要保留的列(含新生成的EndingDate),确认后展开数据。
  4. 整理列:删除多余的分组列,调整列顺序至需求格式。

方法2:索引+行引用(简洁高效)

  1. 添加索引列:点击添加列>索引列>从0开始,生成从0递增的索引列。
  2. 添加EndingDate列:点击添加列>自定义列,输入以下M代码:
    let
        nextRow = try #"添加的索引"{[索引]+1} otherwise null,
        validNextDate = if nextRow <> null and nextRow[编号] = [编号] then nextRow[起始日期(StartingDate)] else null
    in
        if validNextDate <> null then Date.AddDays(validNextDate, -1) else null
    
  3. 清理列:删除索引列,调整列顺序即可。

完整M代码示例(以Excel表"Table1"为数据源)

let
    源 = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    调整数据类型 = Table.TransformColumnTypes(源,{{"编号", Int64.Type}, {"供应商", Int64.Type}, {"起始日期(StartingDate)", type date}, {"成本", Int64.Type}}),
    排序数据 = Table.Sort(调整数据类型,{{"编号", Order.Ascending}, {"起始日期(StartingDate)", Order.Ascending}}),
    添加索引 = Table.AddIndexColumn(排序数据, "索引", 0, 1, Int64.Type),
    生成EndingDate = Table.AddColumn(添加索引, "EndingDate", (row) => 
        let
            nextRow = try 添加索引{row[索引]+1} otherwise null,
            nextDate = if nextRow <> null and nextRow[编号] = row[编号] then nextRow[起始日期(StartingDate)] else null
        in
            if nextDate <> null then Date.AddDays(nextDate, -1) else null
    ),
    删除冗余列 = Table.RemoveColumns(生成EndingDate,{"索引"}),
    调整列顺序 = Table.ReorderColumns(删除冗余列,{"编号", "供应商", "起始日期(StartingDate)", "成本", "EndingDate"})
in
    调整列顺序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:17:08