有没有一种方法可以根据另一列的条件过滤和 return 一列的唯一性结果?
Is there a way to filter and return results for the unique of one column, with conditions of another?
问题
对于下面的数据,是否有办法 return 结果——对于列 B 中的每个订单——要么:
- 如果订单(例如订单 10021)的最新状态 [col D] 已关闭,则 return 该行。
- 如果不是,return 自该订单的最近关闭状态以来的每一行(例如订单 10020,第 4 行和第 5 行)。
之前的努力和尝试的解决方案
以前,我只 return 一个结果,每个订单的最新状态如下:
=SORTN(SORT(A2:D,1,FALSE),9^9,2,2,FALSE)
但是,我希望订单可以有多个当前状态。
我已经尝试了一些东西,并且能够实现我正在寻找的东西,不幸的是只有在有一个订单的情况下,具有以下内容:
(下面的链接 sheet 解释了我是如何做到这一点的)
=IFERROR(FILTER(A2:D5,A2:A5>INDEX(SORT(FILTER(A2:D5,D2:D5="CLOSED"),1,0),1,1)),FILTER(A2:D5,A2:A5>=INDEX(SORT(FILTER(A2:D5,D2:D5="CLOSED"),1,0),1,1)))
我能想到的另一种选择是带循环的脚本。
总结
很难知道如何给这个问题起标题,但之所以想到这个问题,是因为本质上我们是在尝试过滤 col B 的独特性,条件是针对 col A 和 D。
Here's a link 样本 Google 展开 sheet 您可以编辑,显示所有尝试。
非常感谢您的所有帮助和意见!
可能是这样的:
=ARRAYFORMULA(UNIQUE(SORT({VLOOKUP(UNIQUE(INDIRECT("B2:B"&COUNTA(B2:B)+1)),
SORT({B2:B, TO_TEXT(A2:D)}, 2, 0), {2, 3, 4, 5}, 0);
FILTER(A2:D, D2:D="RETURN")},1,1)))
解决方案
所有功劳都归功于找到完整答案的 Matt King。
=ARRAYFORMULA(QUERY({A:D,(COUNTIFS(C:C,C:C,A:A,">="&A:A)=1)*(D:D="CLOSED")
+NOT(REGEXMATCH(TRIM(TRANSPOSE(QUERY(IF((TRANSPOSE(A:A)<=A:A)*(TRANSPOSE(C:C)=C:C),D:D,)
,,9^99))),"CLOSED"))},"select Col1,Col2,Col3,Col4 where Col5=1"))
本质上,
- 首先为任何给定订单的每一行分配一个计数
- 转置和组合状态
- 如果里面有CLOSED状态,就不要用
- 然后用查询语言过滤
导致——
参见解决方案 here。
Mod
我添加了一个从当前记录中完全排除状态 NOTE 的子句—
=ARRAYFORMULA(QUERY({A:D,(COUNTIFS(B:B,B:B,A:A,">="&A:A)=1)*(D:D="CLOSED")+
(ARRAYFORMULA(IF((ARRAYFORMULA(NOT(REGEXMATCH(TRIM(TRANSPOSE(QUERY
(IF((TRANSPOSE(A:A)<=A:A)*(TRANSPOSE(B:B)=B:B),D:D,),,9^99))),"CLOSED"))))
=TRUE,IF((ARRAYFORMULA(NOT(TRANSPOSE(ARRAYFORMULA(TRANSPOSE(D:D)))="NOTE")))
=FALSE,FALSE,TRUE),FALSE)))},"select Col1,Col2,Col3,Col4 where Col5=1"))
实施
这是针对 2500 行数据进行的样本测试,执行时间超过 80 秒。因此,虽然这回答了问题,但不一定是可行的解决方案。
问题
对于下面的数据,是否有办法 return 结果——对于列 B 中的每个订单——要么:
- 如果订单(例如订单 10021)的最新状态 [col D] 已关闭,则 return 该行。
- 如果不是,return 自该订单的最近关闭状态以来的每一行(例如订单 10020,第 4 行和第 5 行)。
之前的努力和尝试的解决方案
以前,我只 return 一个结果,每个订单的最新状态如下:
=SORTN(SORT(A2:D,1,FALSE),9^9,2,2,FALSE)
但是,我希望订单可以有多个当前状态。
我已经尝试了一些东西,并且能够实现我正在寻找的东西,不幸的是只有在有一个订单的情况下,具有以下内容:
(下面的链接 sheet 解释了我是如何做到这一点的)
=IFERROR(FILTER(A2:D5,A2:A5>INDEX(SORT(FILTER(A2:D5,D2:D5="CLOSED"),1,0),1,1)),FILTER(A2:D5,A2:A5>=INDEX(SORT(FILTER(A2:D5,D2:D5="CLOSED"),1,0),1,1)))
我能想到的另一种选择是带循环的脚本。
总结
很难知道如何给这个问题起标题,但之所以想到这个问题,是因为本质上我们是在尝试过滤 col B 的独特性,条件是针对 col A 和 D。
Here's a link 样本 Google 展开 sheet 您可以编辑,显示所有尝试。
非常感谢您的所有帮助和意见!
可能是这样的:
=ARRAYFORMULA(UNIQUE(SORT({VLOOKUP(UNIQUE(INDIRECT("B2:B"&COUNTA(B2:B)+1)),
SORT({B2:B, TO_TEXT(A2:D)}, 2, 0), {2, 3, 4, 5}, 0);
FILTER(A2:D, D2:D="RETURN")},1,1)))
解决方案
所有功劳都归功于找到完整答案的 Matt King。
=ARRAYFORMULA(QUERY({A:D,(COUNTIFS(C:C,C:C,A:A,">="&A:A)=1)*(D:D="CLOSED")
+NOT(REGEXMATCH(TRIM(TRANSPOSE(QUERY(IF((TRANSPOSE(A:A)<=A:A)*(TRANSPOSE(C:C)=C:C),D:D,)
,,9^99))),"CLOSED"))},"select Col1,Col2,Col3,Col4 where Col5=1"))
本质上,
- 首先为任何给定订单的每一行分配一个计数
- 转置和组合状态
- 如果里面有CLOSED状态,就不要用
- 然后用查询语言过滤
导致——
参见解决方案 here。
Mod
我添加了一个从当前记录中完全排除状态 NOTE 的子句—
=ARRAYFORMULA(QUERY({A:D,(COUNTIFS(B:B,B:B,A:A,">="&A:A)=1)*(D:D="CLOSED")+
(ARRAYFORMULA(IF((ARRAYFORMULA(NOT(REGEXMATCH(TRIM(TRANSPOSE(QUERY
(IF((TRANSPOSE(A:A)<=A:A)*(TRANSPOSE(B:B)=B:B),D:D,),,9^99))),"CLOSED"))))
=TRUE,IF((ARRAYFORMULA(NOT(TRANSPOSE(ARRAYFORMULA(TRANSPOSE(D:D)))="NOTE")))
=FALSE,FALSE,TRUE),FALSE)))},"select Col1,Col2,Col3,Col4 where Col5=1"))
实施
这是针对 2500 行数据进行的样本测试,执行时间超过 80 秒。因此,虽然这回答了问题,但不一定是可行的解决方案。