摘要:如图,源文件为学生每次违规的记录,要求按如下规则求出最后的记录是第几次有效记录:满三次违纪,学校停宿,停宿后次数归零,再从第1次开始记录,距前次违纪超过21天,减一次,距前次违纪超过42天,减二次。公式如下:
如图,源文件为学生每次违规的记录,要求按如下规则求出最后的记录是第几次有效记录:满三次违纪,学校停宿,停宿后次数归零,再从第1次开始记录,距前次违纪超过21天,减一次,距前次违纪超过42天,减二次。公式如下:
=DROP(REDUCE("",A2:A40,LAMBDA(x,y,LET(
a,FILTER(学生操行!C:C,(学生操行!A:A=y)*(LEFT(学生操行!D:D,4)=LEFT(C1,4))),
注释1,"提取相同违纪类别和学号的时间记录",
rr,REDUCE(10000,a,LAMBDA(m,n,LET(
注释2,"对提取出的日期进行循环",
b,XMATCH(n,a),
注释3,"匹配循环到的日期在整个记录中的位置",
c,INDEX(a,b-1),
注释4,"提取本次循环的上一个日期,方便与当前日期作减法",
d,INDEX(m,ROWS(m)),
注释5,"提取出累积器中最后一行的数据,也就是上一次循环产生的有效次数",
e,IFS((b=1)+(d=3),1,n-c>42,MAX(1,d-2),n-c>21,MAX(1,d-1),TRUE,d+1),
注释6,"条件判断当前循环日期的正确有效次数",
VSTACK(m,r)))),
rrr,VSTACK(x,IFERROR(TAKE(rr,-1),0)),
注释7,"匹处理因为没有数据面产生的错误,方便进行调试",
rrr))),1)
公式的核心为对规则条件的判断逻辑应该怎么写,同时对累积器m的调用也很重要。
(首次记录) || (当前评分为3), 重置为1分,时间差 >42天, 评分-2(最低1分),时间差 >21天, 评分-1,其他情况, 评分+1参战情况:共有13个函数参与:REDUCE, LAMBDA, LET, FILTER, LEFT, XMATCH, INDEX, ROWS, IFS, MAX, VSTACK, IFERROR, TAKE。
在日常使用逻辑类函数时通常先想到if函数,因为一般都接触的早,而且逻辑和人的思维方式差不多,但多层嵌套太难理解,但ifs函数其实更简洁。
来源:天宇教育