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
相关产品推荐
相关产品推荐

