作用:根据条件筛选某张表再返回一张新表
语法:Filter=(表名,筛选条件)
定义:①表函数(返回一张表),②行上下文函数-具有迭代功能(逐行扫描进行筛选)
应用一
表1:
工号 | 归属架构 | 入职日期 | 评分 |
aa01 | A区域 | 2023-01-01 | 56 |
aa03 | G区域 | 2022-12-14 | 100 |
aa06 | C区域 | 2022-10-24 | 80 |
aa02 | A区域 | 2022-04-03 | 65 |
aa08 | G区域 | 2021-12-25 | 70 |
aa07 | B区域 | 2023-01-18 | 13 |
问:筛选表中A区域的数据,并返回表
表2 = filter('表1','表1'[所属架构]="A区域")
工号 | 归属架构 | 入职日期 | 评分 |
aa01 | A区域 | 2023-01-01 | 56 |
aa02 | A区域 | 2022-04-03 | 65 |
问:筛选表中A区域且评分合格的数据,并返回表
1使用连接符&&
表2 = filter('表1','表1'[所属架构]="A区域" && '表1'[评分]>=60)
2使用and
函数
表2 = filter('表1',and('表1'[所属架构]="A区域",'表1'[评分]>=60))
注:and
只能连接2个条件,若条件3个或以上,则需要嵌套,如and(and(...))
3当筛选条件较多的情况下,使用var
使表达式易读
表2 =
var tb1=filter('表1','表1'[所属架构]="A区域")
return filter(tb1,'表1'[评分]>=60)
工号 | 归属架构 | 入职日期 | 评分 |
aa02 | A区域 | 2022-04-03 | 65 |
PS:或的连接符||
,函数为or
应用二
表2:
工号 | 科目 | 基本补贴 |
aa01 | 车费 | 50 |
aa03 | 车费 | 50 |
aa06 | 车费 | 50 |
aa02 | 车费 | 50 |
aa08 | 车费 | 50 |
aa07 | 车费 | 50 |
aa01 | 饭贴 | 100 |
aa03 | 饭贴 | 100 |
aa06 | 饭贴 | 100 |
aa02 | 饭贴 | 100 |
aa08 | 饭贴 | 100 |
aa07 | 饭贴 | 100 |
问:给评分合格的员工,其饭贴+5
1使用filter将符合条件的数据拆分成表,再去计算
①由于是在表2中新增加列,先筛选表2 中的科目,赋值给tb1(表)
②再筛选tb1,且关联表1中评分合格的数据related(关系函数-前提是表1和表2之间有关系线)
③最后满足条件的数据中,基础补贴+5
新补贴 = calculate(
var tb1=filter('表2','表2'[科目]="饭贴")
var tb2=filter(tb1,related('表1'[评分])>=60)
return sumx(tb2,'表2'[基本补贴]+5)
)
通常情况下,多张表在多个条件的情况下计算,使用filter一层层的筛选,可以提升计算速度
但是碰到:一张大数量表中,某个条件的数据在该表只有几条的情况,那么filter也没法提升速度
工号 | 科目 | 基本补贴 | 新补贴 |
aa01 | 车费 | 50 | |
aa03 | 车费 | 50 | |
aa06 | 车费 | 50 | |
aa02 | 车费 | 50 | |
aa08 | 车费 | 50 | |
aa07 | 车费 | 50 | |
aa01 | 饭贴 | 100 | |
aa03 | 饭贴 | 100 | 105 |
aa06 | 饭贴 | 100 | 105 |
aa02 | 饭贴 | 100 | 105 |
aa08 | 饭贴 | 100 | 105 |
aa07 | 饭贴 | 100 |
方法二:可以使用if逻辑去判断新补贴= if(and(RELATED('表1'[评分])>=60,'表2'[科目]="饭贴"),'表2'[基本补贴]+5,BLANK())
逐行判断,不适用于大数据量