各位打杂小弟在初次使用BI的时候对于一些模糊匹配的应用是比较依赖的,因为我们在Excel当中也是经常用到模糊匹配一类的东西(就那个包含匹配的那个),特别是在处理URL的时候对这个特别依赖,如果要用合并查询进行匹配那数据清洗的难度就会呈指数上升,这对刚接触BI的新手来说不太友好,那今天就给大家分享一下BI中的模糊匹配
我们先来看一下整体的代码:
let
源= 商务通数据,
源2= 项目参数,
源3= 账户参数,
Fx= (x) => Table.SelectRows(源2, each Text.Contains(x,[标识])){0}[项目],
项目 = Table.AddColumn(源, "项目", each try Fx([初次访问网址]) otherwise null),
Fx1= (x1) => Table.SelectRows(源3, each Text.Contains(x1,[标识])){0}[账户],
账户 = Table.AddColumn(项目, "账户", each try Fx1([初次访问网址]) otherwise null)
in
账户
下面为大家详细讲解一下代码
源= 商务通数据,
源2= 项目参数,
源3= 账户参数,
这里呢,是把商务通数据和我们的各种标识(我这里写的是参数)引用到同一个查询
Fx= (x) => Table.SelectRows(源2, each Text.Contains(x,[标识])){0}[项目],
项目 = Table.AddColumn(源, "项目", each try Fx([初次访问网址]) otherwise null),
Fx1= (x1) => Table.SelectRows(源3, each Text.Contains(x1,[标识])){0}[账户],
账户 = Table.AddColumn(项目, "账户", each try Fx1([初次访问网址]) otherwise null)
这里是定义了两个函数,分别是Fx,Fx1。Fx对应的是项目参数。Fx1对应账户参数。两个函数的本质是一样的 ,就用Fx来给大家做一个详细的讲解
Fx= (x) => Table.SelectRows(源2, each Text.Contains(x,[标识])){0}[项目],
其中Fx是我们对函数定义的名称;
(x)为参数名称,即函数作用于的对象;(你可以理解为X是我们命名的变量,也就是不确定的值,这个值也是嵌套在Fx这个函数里面的)
误区:这里有两个命名一个是Fx就相当于对整个函数起了个名字,还有一个是X,是在Fx这个函数中又命名了一个参数的名称
Table.SelectRows(源2, each Text.Contains(x,[标识])){0}[项目])
解读:
表示 在 源2中,被X所包含的[标识]字段(也可以说列)中的行,取第一行项目字段的值
翻译成大白话也就是,在 源2 这张表的 标识列 筛选 被X包含 的行,取这一行的项目列
函数定义完成之后,我们就可以调用这个函数
项目 = Table.AddColumn(源, "项目", each try Fx([初次访问网址]) otherwise null)
表示,新建一列,命名为项目,然后将刚刚定义的函数引用于[初次访问网址]这一列,也就是刚才的X=[初次访问网址],返回Fx的运行结果。
也就是说这一行代码有的作用是新建一个项目列然后让
Fx= (x) => Table.SelectRows(源2, each Text.Contains(x,[标识])){0}[项目],
这一行代码中的X等于初次访问网址。并且将运行结果放在刚才新建的这一列中。
Fx1也是这个道理如法炮制
思维误区:
我们通常在Excel中的逻辑是,以初次访问网址为准,在初次访问网址这一列中包含某个标识,然后返回这个标识对应的项目。
但是在这里的逻辑是不一样的,以初次访问网址为准,在标识表中筛选被初次访问网址包含的行,然后返回第一行对应的项目列。
这里的处理方式与我们常用的Excel函数的思维是不一样的,实现方法和原理也是不一样的,所以不要习惯性的代入Excel函数的思维,一不小心就翻车
前期我们的各种URL规格都不一样,所以对于模糊匹配的需求还是挺高的,后期可以将所有信息编码进URL,这样子对这种模糊匹配依赖就变小了