有没有一种方法可以过滤和返回一列的唯一性,而另一列的条件的结果呢?

时间:2019-06-02 16:30:23

标签: filter google-sheets google-sheets-formula array-formulas gs-vlookup

问题

对于以下数据,有没有一种方法可以返回结果(针对B列中的每个订单):

  1. 如果订单(例如订单10021)的最新状态[col D]已关闭,则返回该行。
  2. 如果不是,则返回该订单的最近关闭状态以来的每一行(例如,订单10020的第4行和第5行)。

data

先前的尝试和尝试的解决方案

以前,我只返回一个结果,即每个订单的最新状态,并显示以下内容:

=SORTN(SORT(A2:D,1,FALSE),9^9,2,2,FALSE)

但是,我想订单是否可以具有多个当前状态。

不幸的是,我尝试了几件事,并且能够实现我想要的东西,

(下面的链接表解释了我的操作方法)

=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)))

我能想到的另一种选择是带有循环的脚本。

摘要

很难知道如何为这个问题加上标题,因为实际上我们试图过滤条件B的唯一性,条件是针对条件A和D。

Here's a link到您可以编辑的示例Google电子表格,其中显示了所有尝试。

非常感谢您的帮助和评论!

2 个答案:

答案 0 :(得分:1)

也许是这样的:

=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)))

enter image description here

答案 1 :(得分:0)

解决方案

所有归功于Matt 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状态,请不要使用
  • 然后使用查询语言进行过滤

产生-

enter image description here

请参阅解决方案here

修改

我添加了一个子句以将状态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秒钟以上的时间来执行。因此,尽管这可以回答问题,但这不一定是可行的解决方案。