查找值基于最新匹配条件

时间:2013-12-15 01:16:32

标签: google-sheets

下面是我所拥有的表的示例,我想要做的是根据最后一次出现(不包括今天的日期)获取特定条件的值列中的值。

所以在下面的例子中,我想找到最后一次出现'A'的值,即12。

我认为这可以通过索引匹配完成,但我无法理解它。

例如

Todays Date: 15/12/2013
---------------------------------|
|Date        | Criteria | Value
|--------------------------------|
|12/11/2013  | A        | 3      |
|16/11/2013  | B        | 6      |
|27/11/2013  | C        | 7      |
|3/12/2013   | A        | 12     |
|5/12/2013   | B        | 8      |
|15/12/2013  | A        |        |
----------------------------------

编辑: 我还想补充一点,这个公式将与上表不同。公式中的工作表参考也需要是动态的,它将从另一个单元格中绘制工作表名称。

3 个答案:

答案 0 :(得分:6)

我会使用这个公式:

=指数(C:C,MAX(ARRAYFORMULA(匹配(过滤器(A:A,B:B =" A" C:℃下;>"&#34)中,A:A,0))),1)

此公式假设您的数据位于A,B,C列以及每个" A" “条件”列中的值,日期不同。 (如果情况并非如此,那么这个公式不会起作用,见下文。

让我们从外面看一下公式:

  1. 过滤器(A:A,B:B =" A",C:C&#"") - 这将导致有一个" A"在Criteria列中,Value列不为空。
  2. ARRAYFORMULA(匹配(过滤器(A:A,B:B =" A" C:℃下;>"&#34)中,A:A,0 )) - 在这一步中,我们基本上可以找到存在这些日期的行号。匹配功能将搜索日期(在步骤1中计算)。需要arrayformula,因为会有更多的结果。
  3. MAX(ARRAYFORMULA(匹配(过滤器(A:A,B:B =" A" C:℃下;>"&#34),A:甲,0))) - 这将找到最大行号(在条件列中包含" A"的最大行号)
  4. 指数(C:C,MAX(ARRAYFORMULA(匹配(过滤器(A:A,B:#34&℃温;>&#34:B =" A&#34,C ;),A:A,0))),1) - 最后,我们使用INDEX函数导航到具有最大行号的值。
  5. 现在,如果您希望此公式适用于其他工作表,则应编写,而不是例如:

    = index(C:C,... => = index(数据!C:C,......

    假设您的数据位于数据工作表中。

    如果你希望这张表格是动态的,那就有点棘手了。让我们假设您从G1单元格中获取了工作表名称的值。然后你应该写:

    =指数(间接(串连(G1," C:!C&#34)),...

    这不是那么漂亮,因为你应该在那个长公式(如前所述)中出现的每个场合都这样做。相反,你可以做一些前期工作。

    让我们把这个写入H1单元格:=连接(G1,"!C:C") - 如果在G1单元格中,工作表名称是"数据" ,然后H1单元格应该包含:Data!C:C,类似地你可以添加到

    H2 cell:= concatenate(G1,"!A:A"), H3单元格:=连接(G1,"!B:B")

    现在你可以写(而且我认为这是你问题的最终答案):

    <强> =指数(间接(H1),最大值(ARRAYFORMULA(匹配(过滤器(间接(H2),间接的(H3)=&#34; A&#34;,间接的(H1)&LT;&GT;& #34;&#34;),indirect(H2),0))),1) - 其中H1,H2,H3将引用您的数据表的列。

    我希望它有所帮助。

答案 1 :(得分:1)

使用以下公式来实现这一目标。

=QUERY(
   B1:D6,                // data
   "SELECT D             // select
    WHERE                // where clause
      C = 'A' AND        // first criterium
      D IS NOT NULL      // second criterium
    ORDER BY B DESC      // order by
    LIMIT 1,             // limit
    0"                   // headers
 )

for copy/paste
=QUERY(B1:D6, "SELECT D WHERE C = 'A' AND D IS NOT NULL ORDER BY B DESC LIMIT 1", 0)

解释

公式的线索是在ORDER BY公式中使用LIMITQUERY选项。 WHERE条款将首先准备结果。接下来,列B(日期)按降序排列(最高的第一个)。 LIMIT选项设置要在1显示的行数。

实施例

我为您创建了一个示例文件:Lookup value based on latest matching Criteria

答案 2 :(得分:0)

我很欣赏这是一个稍微陈旧的问题,但我有一种方法可以实现过滤数组的目标,我发现它在概念上更直接,并且比我看到的其他答案更常用,使用vlookup的定义能够选择数组中的第一个匹配值。

问题,已恢复:

假设样本数据: A ... B ... C ... D ... E,由谷歌表格

创建

A是表单输入日期 B,C和D是列表中的条目(假设它们是例如产品名称,地理位置和销售日期) E是值

如果为特定产品,地理位置,日期输入新值,那么我希望使用此值优先于相同数据的旧版本。

解: 如果在表单中创建了三个新列: F独特的测试 G测试细胞合并 H独特的细胞

然后在G列中,您创建了要测试的所有单元格的组合(在本例中为B,C和E) cell G2: "=arrayformula(B2:B & char(9) & C2:C & char(9) & D2:D)"

下一列是您要基于的过滤单元格的重述(在本例中为A中的日期) cell H2: "=arrayformula(A2:A)"

然后最后在F栏我们实际进行了测试: cell F2: "=arrayformula(A2:A=vlookup(G2:G,sort({G2:H},2,false),2,false))"

打破这一点,vlookup(vlookup(G2:G,[RANGE],2,false)将G2,G3 ... Gn中的数据与[RANGE]进行比较,[RANGE]是一个由两列组成的虚拟数组,G和H,按照单元格H按降序预先排序。

即。对于G的任何唯一值(测试数据的组合),vlookup将返回H

的最大值

最后一部分是对原始数据(A2,A3 ... An)的简单比较,根据它是否是唯一值的最新版本返回TRUE或FALSE。

如果需要,最后一步是创建一个包含"=filter('Form Responses 1'!A:E,'Form Responses 1'F:F=TRUE)的新工作表,以便在没有旧版本的情况下重新创建数据。

希望这有帮助。