有没有一种方法可以根据另一列的条件过滤和 return 一列的唯一性结果?

Is there a way to filter and return results for the unique of one column, with conditions of another?

问题

对于下面的数据,是否有办法 return 结果——对于列 B 中的每个订单——要么:

  1. 如果订单(例如订单 10021)的最新状态 [col D] 已关闭,则 return 该行。
  2. 如果不是,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 秒。因此,虽然这回答了问题,但不一定是可行的解决方案。