学会使用PowrQuery的自定义函数

L3Byb3h5L2h0dHBzL3M0LjUxY3RvLmNvbS9pbWFnZXMvYmxvZy8yMDIxMDcvMTQvYjk1NTRiYWYxNzdhMTE5ZmQ5MjZkNzJiMGJkNTlkMWQuanBlZw

使用Power Query进行复杂一些的数据处理,离不开M函数,目前已经有超过700个函数了,基本上各式各样的数据处理需求都可以使用M函数实现,如果你觉得这些还不够,或者使用起来不是很方便,也可以在PQ中自定义函数。

自定义函数的语法

如果在M编辑器中看到这个符号: => ,就是有自定义函数在里面,自定义函数的基本语法是:

函数名=(参数1,参数2,参数3……)=>表达式

函数名可以任意写,只要和M语言里的关键字不要重复就行,参数至少有1个,放在括号中,如果有多个参数,以逗号分隔,=>后面就是自定义函数的表达式。

为了保证结果的准确性,可以预先限定参数的数据类型,假如有两个参数a和b,限制为数值型,可以这样写:

函数名=(a as number,b as number)=>表达式

当然不限制也是可以的,不限制就是可以为任意类型。

参数还可以是可选的,在参数前加上optional就可以了,比如有两个参数,第一个参数a,第二个参数b是可选参数,自定义函数这样写:

函数名=(a,optional b)=>表达式

这样只要输入参数a,无论是否输入参数b都可以调用这个自定义函数了。

自定义函数示例

我们先在Power Query编辑器中创建一个简单的自定义函数,新建一个空查询,在编辑器重输入:= (x)=>{1..x},确定后出现参数调用窗口,

L3Byb3h5L2h0dHBzL3M0LjUxY3RvLmNvbS9pbWFnZXMvYmxvZy8yMDIxMDcvMTQvZTA0ZmFjNDc5MzExYWY2MTAxNjI5ZmUyYjUzY2I1Y2UucG5n

这个自定义函数只有一个参数x,生成从1到x的序列,指定为自定义函数后,左边的空查询类型就变成了fx, 名称可以根据自定义函数的含义进行重命名,这里把函数名改成mylist。

参数x输入10,点击“调用”:

L3Byb3h5L2h0dHBzL3MzLjUxY3RvLmNvbS9pbWFnZXMvYmxvZy8yMDIxMDcvMTQvMTlmNTBiMmQxZmMzMzQ2MzEwMzJhNWRmODM4NzI4NDgucG5n

就生成了从1到10到一个序列。

自定义函数的参数不是每次都要手动输入进去,同样可以调用其他数据,比如将上面的这个序列转化为表,然后添加一个自定义列=mylist([Column1])

L3Byb3h5L2h0dHBzL3MzLjUxY3RvLmNvbS9pbWFnZXMvYmxvZy8yMDIxMDcvMTQvNjM0NTY1OGI5N2RhYjUzZmY2MTExMzczMTk5ZDM0MjUucG5n

这个自定义列的每一行数据,就是从1到第一列数据的序列,

L3Byb3h5L2h0dHBzL3M0LjUxY3RvLmNvbS9pbWFnZXMvYmxvZy8yMDIxMDcvMTQvZTlkM2VhZmVjYzA2YWZkMmRkNzVjZGI3NTllOGI0NGUucG5n

从这里也可以看出,自定义函数mylist可以和其他标准的M函数一样使用。

自定义函数也并不是一定要提前定义好,还可以在需要的时候随时自定义,并立即使用,还是上面的这张表,需要对第一列累计求和,即计算从第一行到当前行的合计数。

添加自定义列,公式可以这样写:

累计=List.Sum(Table.SelectRows(转换为表,(x)=>x[Column1]<=[Column1])[Column1])

将上面函数拆解
List.Sum()

Table.SelectRows(转换为表,(x)=>x[Column1]<=[Column1])

将转换的表赋值为x ,x[Column1]小于等于_[Column1]

L3Byb3h5L2h0dHBzL3M5LjUxY3RvLmNvbS9pbWFnZXMvYmxvZy8yMDIxMDcvMTQvNGRkNTBiNzI1NmMzNTZmNTQ1ZTQ0NGIxNDVjZWVkNTkuanBlZw

然后就生成一列累计数,和预想的一致,

L3Byb3h5L2h0dHBzL3MzLjUxY3RvLmNvbS9pbWFnZXMvYmxvZy8yMDIxMDcvMTQvMGJmYzk0ZjA1MGQ5OTQ4MmMxODEzZGUxMTI3OGVlYmMucG5n

其中(x)=>x[Column1]<=[Column1]就是一个自定义函数,该自定义函数作为Table.SelectRows的条件返回小于等于当前行的所有行,然后对筛选出的这些行的[Column1]列,使用List.Sum来求和。

不过这种在某个步骤中使用的自定义函数,只能供该查询使用,而前面生成的自定义函数mylist,可以供该文件内的所有查询使用。

其实前面的文章中也使用过自定义函数,比如使用M生成日期表就使用了自定义函数,

L3Byb3h5L2h0dHBzL3MzLjUxY3RvLmNvbS9pbWFnZXMvYmxvZy8yMDIxMDcvMTQvNjEwNGRmMWY4ODgwYmNmYTA3MmM1NWJmMGFkODRiY2QucG5n

可以点击图片查看该文,了解利用自定义函数制作日期表的用法。

通过以上的介绍,基本可以对自定义函数有个初步的了解,其实自定义函数的用法很广泛,以后在进行复杂的数据处理时还会经常用到它。

 

相关推荐

二维表转一维表

什么是一维表 在 Excel 中常见的是二维表 年度 北京 天津 上海 杭州 2015 200 100 300 ...

power query 使用常用正则

经常会使用power query 清洗数据,但是经常会存在使用M函数又太复杂的情况,因此需要借助正则表达式。进 ...