在REDUCE函数里再嵌套REDUCE函数时,可能需要对第一个REDUCE函数中的每一行进行提取、运算或操作。这时,可以在第二个REDUCE函数中使用SEQUENCE(ROWS(X))生成一个自然数序列作为y,然后逐行提取x中的每一行进行运算。
第一个例子,生成多列数据的组合。如下图,A:D的每列是一个属性的元素,要求生成所有属性的不重复组合,效果如右侧F:I列。
参考公式如下:
- =REDUCE(A1:A3,B1:D1,LAMBDA(x,y,DROP(REDUCE(0,SEQUENCE(ROWS(x)),LAMBDA(m,n,LET(t,INDEX(x,n,),VSTACK(m,IFNA(HSTACK(t,TOCOL(OFFSET(y,,,99),1)),t))))),1)))
复制代码
公示简要说明如下:
=REDUCE(
A1:A3,
B1:D1, 循环每一列第一个单元格
LAMBDA(x, y,
DROP(
REDUCE(
0,
SEQUENCE(ROWS(x)), 生成1~外层REDUCE函数当前x行数的序列
LAMBDA(m, n,
LET(
t, INDEX(x, n, ), 提取外层x的每一行
VSTACK(
m,
IFNA(HSTACK(t, TOCOL(OFFSET(y, , , 99), 1)), t) 将x中的每一行和当前循环列元素进行横向堆叠
)
)
)
),
1
)
)
)
第二个例子,按层级关系展开。如下图A:B列是不同职务上下级关系,要求展开成为右侧结果。
参考公式如下:
- =LET(P,B2:B46,Q,C2:C46,v,REDUCE(FILTER(P,Q=0),P,LAMBDA(x,y,DROP(REDUCE(0,SEQUENCE(ROWS(x)),LAMBDA(m,n,LET(o,INDEX(x,n,),u,TAKE(o,,-1),VSTACK(m,IF(COUNTIF(Q,u),HSTACK(o,SORT(FILTER(P,Q=u))),o))))),1))),w,IFNA(v&CHAR(10)&XLOOKUP(v,B:B,A:A),""),VSTACK("第"&SEQUENCE(,COLUMNS(w))&"级",w))
复制代码
公式简要说明如下:
=LET(
P, B2:B46,
Q, C2:C46,
v, REDUCE(
FILTER(P, Q = 0), 筛选出最顶级的职务姓名
P,
LAMBDA(x, y,
DROP(
REDUCE(
0,
SEQUENCE(ROWS(x)), 生成1~外层REDUCE函数当前x行数的序列
LAMBDA(m, n,
LET(
o, INDEX(x, n, ), 提取外层x的每一行
u, TAKE(o, , -1), 提取每一行最后一个姓名用于后续筛选
VSTACK(m, IF(COUNTIF(Q, u), HSTACK(o, SORT(FILTER(P, Q = u))), o)) 筛选u的下一级并排序后和o横向堆叠
)
)
),
1
)
)
),
w, IFNA(v & CHAR(10) & XLOOKUP(v, B:B, A:A), ""), 查询职务名称并连接
VSTACK("第" & SEQUENCE(, COLUMNS(w)) & "级", w) 生成级别的表头
)
|