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

Power Query:使用M语言按类别获取每条记录的上一日期

Power Query M语言优雅实现按类别生成上一日期列

需求回顾

原始表格:

Cat | Date
A   | 1-Jan
A   | 2-Jan
A   | 3-Jan
B   | 1-Feb
B   | 2-Feb

目标表格:

Cat | Date  | Prev
A   | 1-Jan | null 
A   | 2-Jan | 1-Jan
A   | 3-Jan | 2-Jan
B   | 1-Feb | null
B   | 2-Feb | 1-Feb

(注:你提供的目标表格中B类第二条的Prev值应为1-Feb,属于笔误,以下代码按逻辑生成正确结果)

实现代码

假设你的原始数据源表名为Source,直接使用以下M语言代码即可完成需求:

let
    Source = 你的原始数据源,
    // 按类别分组,每组内生成包含日期与上一日期的子表
    Grouped = Table.Group(Source, {"Cat"}, {
        {"GroupedData", (t) => 
            let
                DateList = t[Date],
                // 生成上一日期列表:开头补null,后续取当前日期列表去掉最后一项的结果
                PrevList = {null} & List.RemoveLastN(DateList, 1),
                // 将日期列表与上一日期列表合并为子表
                Combined = Table.FromColumns({DateList, PrevList}, {"Date", "Prev"})
            in
                Combined
        }
    }),
    // 展开分组后的子表,得到最终结果
    Expanded = Table.ExpandTableColumn(Grouped, "GroupedData", {"Date", "Prev"})
in
    Expanded

关键逻辑说明

  • Table.Group:按Cat列分组,对每个分组的子表t单独处理
  • DateList = t[Date]:提取当前分组内的所有日期,转为列表格式
  • PrevList = {null} & List.RemoveLastN(DateList, 1):
    • List.RemoveLastN(DateList,1)会移除日期列表的最后一项,得到比原列表少一个元素的新列表
    • 在新列表前拼接{null},就能生成和原日期列表长度一致的上一日期列表,刚好对应每组第一条数据的Prev为null
  • Table.FromColumns:将日期列表与上一日期列表组合成子表,最后展开即可得到目标结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:05:08