wps/excel函数技巧:reduce+product+mmult解决最短用时问题

摘要:并统计集齐人员所用的最短时长,如果一天集齐5项最短用时算一天,如果时间跨度内齐多次,按最短时间跨度,两个时间直接相减统计最短用时+1天计算

如图A列至G列为源数据,要求统计出黄色区域数据,要求如下:

1.人员参与收集"福禄寿喜财",不限制集的次数

2.要求统计集齐五项人员,未集齐不统计

3.并统计集齐人员所用的最短时长,如果一天集齐5项最短用时算一天,如果时间跨度内齐多次,按最短时间跨度,两个时间直接相减统计最短用时+1天计算

公式如下:

=LET(

列表,REDUCE("",SORT(UNIQUE(A5:A22)),LAMBDA(a,b,LET(

#变量“列表"会形成一个表格,表格由人员名称、5、最短用时三列组成

x,IF(FILTER(C5:G22,A5:A22=b)="",0,1),

#过滤出五福数据变将数据里的”OK"替换成1,空格替换成0

n,FILTER(B5:B22,A5:A22=b), #过滤出每个人员的日期,日期行数与变量x的行数相等

最短天数,MIN(REDUCE("",SEQUENCE(ROWS(x))-1,LAMBDA(ii,jj,VSTACK(ii,DROP(

REDUCE("",SEQUENCE(ROWS(DROP(x,jj))),LAMBDA(ss,tt,VSTACK(ss,IF(PRODUCT (MMULT(SEQUENCE(,tt,1,0),TAKE(DROP(x,jj),tt)))=0,100,INDEX(DROP(n,jj),tt)-INDEX(D ROP(n,jj),1)+1)))),1))))),

#最短天数是利用三次循环得出,得用mmult函数分别对所有行的每种可能组合进行计算,得 出每列都不为0的数据,并根据当前的列号调出时间并与第一行时间相减得到用时,如果有 一 列为0的情况出现则product乘积就会为0,此时输出100

IFERROR(VSTACK(a,HSTACK(b,5,最短天数)),"")))),

FILTER(列表,INDEX(列表,,3)

#将用时大于等于100的过滤掉,也就是将五项不齐全的数据过滤掉

公式思路:本公式最核心部分是得到每个人每列数据的组合,这个组合是用两次循环得到,第一次循环得到每个人数据依次去掉前一行(第一行)、前二行、前三行……的数据,第二次循环根据第一次循环得到的行数分别取前一行(第一行)、前二行、前三行……进行mmult计算,得出是否每列都不为0。

第二参110100101010101

第一参里的一行三列数据分别出第二参里的每一列的三行数据对应相乘:第一列乘以第一行然后再相加、第二列乘以第二行然后再相加……,以第一列为例:

1*1+0*1+1*1=2,根据这个规则5列全部矩阵运算后得到:

这样一组数字表现的是五福出现的次数,只要是没有一列为0则可视为在这个时间内集齐了五福,反之只要是有一列为0则没有集齐。

来源:音乐小黑板

相关推荐