EP023 跨行计算和结构重组的利器List.Range(以计算YTD指标应用示例)

这一节课主要讲解如何使用 List.Range 函数从一个列表中提取一部分连续的元素(子列表),并结合之前学过的 TableList 函数,详细演示一个制作“累加值(YTD)”的实战案例。

一、 核心函数:List.Range

  • 功能:从列表中截取一段连续的元素,返回一个新的列表。
  • 语法
  List.Range(列表, 偏移量(起始下标), [截取个数])
  • 参数详解
  1. 列表 (List):你要操作的那个源列表。
  2. 偏移量 (Offset):从哪个下标开始截取(注意:下标是从 0 开始的(计算机都是从0开始数数))。
  3. 截取个数 (Count):可选参数。如果不填,默认截取后面所有的;如果填了,就截取指定数量。
  • 示例
  • 比如有一个列表:{1, 2, 3, 4, 5}
  • List.Range({1..5}, 2, 3) -> 从下标2(即数字3)开始,取3个数 -> 返回 {3, 4, 5}
  • List.Range({1..5}, 0, 1) -> 从头开始,取1个数 -> 返回 {1}

二、 实战案例 :计算累加值 (YTD)

这是一个财务和数据分析中非常经典的需求:计算截止到当前的累计收入。

解决思路:

  1. 添加索引列:我们需要知道当前是第几行(下标),以便告诉 List.Range 截取多少个数。
    • 操作:添加列 -> 索引列 -> 从0开始。
  2. 在使用List.Range之前,我们先要使用List.把待提取的列,也就是预算实际发生数列表预算数列表提取出来,分别命名为:ListActualListBudget。(这个List.Buffer它的主要作用是从上一个步骤的表格中提取出一列数据转换成“列表(List)”,并将其加载到内存中以提升后续计算的性能。)
    ListBudget = List.Buffer( 重排序的列[#"当月预算(Budget)"])
    ListActual = List.Buffer( 重排序的列[#"当月实际(Actual)"])
  3. 动态截取:对于每一行,截取从列表开头(下标0)到当前行(下标=索引)的所有数字。
    • 公式List.Range(ListActual, 0, [索引] + 1)
    • 解释[索引]是从0开始的,所以截取个数要是 [索引] + 1
  4. 求和:把截取出来的这个子列表求和。
    • 公式List.Sum(List.Range(预算实际发生数列表, 0, [索引] + 1))

详细介绍一下List.Buffer这个函数

这是一段 Power Query (M语言) 的函数。它的主要作用是从上一个步骤的表格中提取出一列数据转换成“列表(List)”,并将其加载到内存中以提升后续计算的性能。

1. 代码拆解:List.Buffer( 重排序的列[#"当月预算(Budget)"])

  • 重排序的列
    这是指代 Power Query 中的上一个步骤的名称。表示这段代码是在名为“重排序的列”的步骤生成的数据基础上进行操作的。
  • [#"当月预算(Budget)"]: 这是 Power Query 中提取单列数据的标准语法。
    • 它从“重排序的列”这个表格中,提取了名为 当月预算(Budget) 的这一列。
    • 在 M 函数中,表名[列名] 这种写法,会把这一列的数据从“表(Table)”结构转换成“列表(List)”结构
    • #"" 这个符号是因为列名中包含了中文字符和括号等非标准英文字母,所以需要用它包裹起来。
  • List.Buffer(...)
    这是这段代码的核心函数。Buffer 的意思是“缓冲”。它的作用是将括号里的这个列表完整地读取并缓存在电脑的内存(RAM)中

2. 为什么要用 List.Buffer?(核心意义)

Power Query 默认采用的是“延迟计算(Lazy Evaluation)”机制。也就是说,它只在绝对必要的时候才计算数据。

如果后续的步骤中需要多次重复引用这个“当月预算”列表(比如用来做复杂的条件判断、VLOOKUP式的跨表匹配、或者自定义列的循环计算),如果不加 List.Buffer,Power Query 可能会在每次用到它时,都把前面的步骤重新跑一遍来获取这个列表,这会导致刷新极度缓慢。

加上 List.Buffer 后,相当于告诉系统:“把这个列表固定在内存里,后面不管用多少次,直接从内存拿,不要再去重新计算了。” 这是一种非常重要且常见的 Power Query 性能优化手段。

3. 总结当前函数运行后的状态

通过这行代码,成功把“重排序的列”步骤里的“当月预算(Budget)”这一列提取了出来,变成了一个缓存在内存中的一维数组(列表)。后续的步骤就可以高速地调用这个列表了。

进阶:计算占比

  • 有了累加值后,可以计算当前累加值占总发生数的比例。
  • 公式[累加预算实际发生数] / [累加预算数],从而算出预算实现率,是超比例完成还是进度未达成?

三、 关键知识点总结

  1. List.Range 的本质:它是列表的“切片刀”。
  2. 利用索引控制范围:在做累加、移动平均等计算时,索引 是控制切片范围的关键变量。
  3. 数据重组思维:制作固定资产卡片的过程,其实是把表格拆解成最基本的“积木”(Record),按照新的规则(表头+资产)重新拼装,最后再组装回表格的过程。这是 Power Query 处理复杂格式报表的核心心法。

💡 核心逻辑解释(请对照着视频课件以及Excel示例文件查看以下内容)

  • 关于 ListActual:它只是一个中间变量(存放在内存里的一个清单),我们用它来做计算素材,但不能把它作为最终结果输出来。
图片[1]-EP023 跨行计算和结构重组的利器List.Range(以计算YTD指标应用示例)-小微之家 | 汪斌带你开公司 | 老汪洞察
  • 关于 Table.AddColumn
    • 它的第一个参数必须是 。所以我们要越过中间的 List 步骤,回头去抓 重排序的列
    • 它的计算逻辑里,用到了 ListActual 这个中间变量。
图片[2]-EP023 跨行计算和结构重组的利器List.Range(以计算YTD指标应用示例)-小微之家 | 汪斌带你开公司 | 老汪洞察

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容