Power Query技术咨询:仅拥有StartingDate时如何生成每行的EndingDate
在Power Query中生成EndingDate的实现方案
需求:为每行生成EndingDate,规则为同编号分组内,当前行的EndingDate等于下一行的StartingDate减去1天,分组内最后一行的EndingDate留空。
示例数据与预期结果
| 编号 | 供应商 | 起始日期(StartingDate) | 成本 | 预期结果(结束日期EndingDate) |
|---|---|---|---|---|
| 1 | 30000 | 2023/1/1 | 100 | 2023/1/13 |
| 1 | 30000 | 2023/1/14 | 105 | 2023/1/27 |
| 1 | 30000 | 2023/1/28 | 110 | |
| 2 | 30000 | 2023/1/1 | 110 | 2023/1/17 |
| 2 | 30000 | 2023/1/18 | 116 | 2023/1/29 |
| 2 | 30000 | 2023/1/30 | 120 | |
| 3 | 30000 | 2023/1/1 | 90 | 2023/1/5 |
| 3 | 30000 | 2023/1/6 | 100 | 2023/1/8 |
| 3 | 30000 | 2023/1/9 | 105 |
实现步骤
前置准备
先确保起始日期(StartingDate)列是日期类型,若不是,选中列后点击转换>数据类型>日期完成转换。同时按编号和起始日期升序排序,保证组内日期顺序正确。
方法1:分组处理(适合复杂分组场景)
- 分组数据:点击
开始>分组依据,设置分组依据为编号,新列名设为组数据,操作选择所有行,确认后生成分组表。 - 添加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 ) - 展开分组:点击
组数据列右侧的展开按钮,勾选所有需要保留的列(含新生成的EndingDate),确认后展开数据。 - 整理列:删除多余的分组列,调整列顺序至需求格式。
方法2:索引+行引用(简洁高效)
- 添加索引列:点击
添加列>索引列>从0开始,生成从0递增的索引列。 - 添加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 - 清理列:删除索引列,调整列顺序即可。
完整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
相关产品推荐
相关产品推荐

