Power Query — 常用函数

前面讲了如何获取全部的函数名称,和查看帮助文档的方法,但是实际运用中不可能去临时查看每一个可能用到的函数,因此有必要熟悉一些常用的函数。(因为函数数量实在太多,受限于篇幅,我就只介绍一些自己用的比较多的函数,按Text/Number/List/Table顺序介绍)

Text类:

我们先看下面的例子:

图01
图02

在使用函数时,一定要注意参数的类型,不过好在M提供了From函数,这样当你的参数是变量而且类型不匹配的时候可以方便地进行转换。

返回参数的文本类型值(可指定语言类型)

Text.From(value as any, optional culture as nullable text) as nullable text
图03
图04
图05
图06

返回字符串某个索引处的字符(从0开始)

Text.At(value as nullable text, index as number) as nullable text

返回字符串结尾指定字符数的字符串

Text.End(string as nullable text, num Chars as number) as nullable text

在字符串指定索引处插入字符串

Text.Insert(textas nullable text, offset as number, newText as text) as nullable text

从指定索引处开始(包含)截取一定字符数的字符串

Text.Middle(text as nullable text, start as number, optional count as nullable number) as nullable text

返回字符串开头指定字符数的字符串

Text.Start(stringas nullable text, count as number) as nullable text

因为这几个函数作用相似,这里就用一个例子展示一遍用法和结果:

=Text.At("xkj",1)&"_"&Text.End("xkj",2)&"_"&Text.Insert("xkj",1,"z")&"_"&Text.Middle("hello",2,3)&"_"&Text.Start("xkj",2)

输出:k_kj_xzkj_llo_xk
图07

因篇幅受限,还有一些类似Text.Lower/Upper(转小写/大写)、Text.Repeat(重复)等就不逐一介绍了,还有一些稍微复杂点的例如Delimiter(分隔符)相关的函数,在操作面板上使用的会相对多一些,需要自己写的占少数。还有一些函数比较特别,例如Text.Remove的参数是一个list,可以一次性移出掉一个序列的字符,很强大,还有一些函数的官方说明写的案例比较多,用法较灵活的如Text.PositionOf(定位)也是需要多摸索的。

Number类:

前面第06篇笔记讲解数学运算时,已经介绍了绝大部分的Number类函数以及对应的数学符号,这里主要举例几个常用的函数的用法。

Number.From(提取数值)

= Number.From(#datetime(2018,10,8,6,53,49))-Number.From(#datetime(1992,10,8,13,25,47))
9495.7278009259244
图08
= Number.From(#datetime(2018,10,8,6,53,49)-#datetime(1992,10,8,13,25,47))
9495.7278009259262
图09

对比上面两幅图,这里有个有意思的数据(观察最后两位数字的差别)

Number.Mod(取余)

= Number.Mod(2018,4)
2
图10

Number.RandomBetween(区间随机数)

= Number.RandomBetween(2,18)
17.181564427531121
图11

Number.RoundDown/Up(向下舍/向上入)

= Number.RoundDown(1.9)/Number.RoundUp(1.1)
0.5
图12

List类:

这类函数是我个人使用比较多的,特别是做算法题时用的会多一些,为了避免和后面算法篇的笔记有内容重复,涉及循环的函数这里就不介绍了。

List.AnyTrue(检查是否有真值)

= List.AnyTrue({0>1,0=1,0<1})
TRUE
图13

List.Difference(求差集)

图14
= List.Difference({0..10},{5..9})
{0,1..4,10}
图15

List.Distinct(去重)

= List.Distinct({1..5}&{3..8}) //(求并集)
{1..8}
图16

List.Intersect(求交集)

=List.Intersect({{1..8},{5..13}}) //(参数类型{lists})
{5..8}
图17

List.Union(求并集)

= List.Union({{1..5},{3..8},{2..6}})(参数类型{lists})
{1..8}
图18

List.First(N)/List.Last(N)(靠前/靠后截取)

={List.First({1..5})}&List.FirstN({1..5},2)&{List.Last({1..5})}&List.LastN({1..5},2)
{1,1,2,5,4,5}
图19

List.Max(N)/List.Min(N)/List.Median/List.Sum/List.Product(最大/前几/最小/后几/中位数/求和/求积)

let
    a={1..4}
in
    {List.Max(a)}&List.MaxN(a,2)&{List.Min(a)}&List.MinN(a,2)&{List.Median(a)}&{List.Sum(a)}&{List.Product(a)}

/* 结果为:{4,4,3,1,1,2,2.5,10,24} */
图20

List.Mode(众数)

=List.Mode({1..5}&{2..6}&{3..7}&{4..8})
5
图21

如果存在多个众数,返回最后一次出现的众数,空集报错!

=List.Mode({1..5}&{2..6}&{3..7}&{4..8}&{13,13,13,13})
13
图22

List.Sort(排序)

=List.Sort({2,3,1})
{1..3}
图23

可选参数:Order.Ascending/Order.Descending(升序/降序)
默认升序

=List.Sort({2,3,1},Order.Descending)
{3,2,1}
图24

可通过自定义函数运算后的结果升序排源序列的顺序。

= List.Sort({-2,1},each _*_)
{1,-2}
图25
= List.Sort({0,1},each 1/_)(第6篇笔记的无穷大知识点)
{1,0}
图26

List.Sum(求和)

= Table.AddColumn(DelCol, "小计", each List.Sum({[收入],[转入],-[支出],-[转出]}))
图27

Table类:

虽然这部分函数个数最多,但是由于大部分对表操作的函数被集成在了菜单上,一般地,我们对菜单操作后自动生成的M语句进行适当的修改就可以满足需求了,因此这里我只介绍几个构造Table的函数。

Table.FromColumns(从列构造)

=Table.FromColumns({{"1*1=1","1*2=2","1*3=3"},{"","2*2=4","2*3=6"},{"","","3*3=9"}})
图28

Table.FromList(从序列构造)

=Table.FromList({[A="1*1=1",B="",C=""],[A="1*2=2",B="2*2=4",C=""],[A="1*3=3",B="2*3=6",C="3*3=9"]},Record.FieldValues, {"A", "B", "C"})
图29

Table.FromRecords(从记录构造)

=Table.FromRecords({[A="1*1=1",B="",C=""],[A="1*2=2",B="2*2=4",C=""],[A="1*3=3",B="2*3=6",C="3*3=9"]})
图30

Table.FromRows(从行构造)

=Table.FromRows({{"1*1=1","",""},{"1*2=2","2*2=4",""},{"1*3=3","2*3=6","3*3=9"}},{"A","B","C"})
图31

我个人比较喜欢从行构造Table.FromRows,代码简洁清晰。

原文:

https://zhuanlan.zhihu.com/p/46136098

作者: Hugh

Welcome to Wan's world~