最近我们练习了不少PQ习题,其中我两次用了类似于字典的功能,今天我们就来跟大家交流一下!
大部分编程语言包括VBA都有Key-Value 存储数据的容器,大家比较熟悉的就是VBA中的字典,PQ中也有对应,那就是record,我们简单看一下基础用法下面就是PQ中的record表示方法,方括号中,key=value 来表示!多个使用逗号分隔!使用& 可以新增或者更新“键值对”!下面简单演示!当然这是一些基础操作,如果key是来源其他字符又该怎么办呢?不用担心,record类相关操作函数虽然没有list多,但是常见的需求完全可以实现!
比如想计算每种产品的当前库存!就需要每种商品的累计构建-累计销售!
一般的思路就是筛选,然后求和,再计算差额!但是数据量大,SelectRows效率堪忧!
下面我们简化一下这个案例,方便说明,关于这个案例的完整解法,请看文末完整的M函数代码!
导入到PQ编辑器,下面我们先看一下代码,简单说一下处理思路!第一步,我们把每行转出记录,方便我们遍历取数,当然也可以转list!这个看大家习惯,异曲同工!第二步,我们遍历这个list,逐行处理。这里要说一下核心思路,处理计算购进-销售,同时把商品名称作为key,检查一下字典中,是否已经存在这个商品,如果已经存在,直接取出+当前差额,更新对应商品库存即可,如果没有也就是首次,给0+当前差额。逻辑一致!下面我们来看一下如何实现!整个过程,我们都需要上次的计算结果,所以一个想到的就是要使用List.Accumulate函数M函数如下,未做简化,第二参数中,第一个元素用来存放每种商品的更新后的库存,第二个元素是一个列表,用来存放添加库存后的当前行数据!最后转出表!
= Table.FromRecords(
List.Accumulate(第一步,{[],{}},(x,y)=>
[ 差额 = y[购进]-y[销售],
上次库存 = Record.FieldOrDefault(x{0},y[商品],0),
更新库存 = Record.AddField([],"库存",上次库存+差额),
更新结果 = {
x{0} & Record.AddField([],y[商品],上次库存+差额),
x{1}&{y & 更新库存}
}
][更新结果]){1}
)
只有直接在编辑栏书写,未格式化,为了提高可读性,我已经使用了中文变量,方便大家理解!
1、Record.FieldOrDefault 可以获取对应key的value,没有可以指定默认值2、Record.AddField,可以处理key是文本的情况,创建record ,更新等知识前面基础已讲解就不再啰嗦!下面我们贴一下第一个实战案例中的完整M代码!已添加了说明!PQ从入门到精通,原本属于长期会员专属教程,一直有朋友希望我单独分离出来,方便有只想学习PQ的同学购买,现在就尝试独立,目前尝试分离,有需要的朋友,可以加 微 yianxss 了解!今天的内容就这里!