【问题标题】:Excluding the last value in a range from an aggregate calculation in Google Sheets从 Google 表格中的聚合计算中排除某个范围内的最后一个值
【发布时间】:2017-05-14 20:00:08
【问题描述】:

我有一个包含两列数据的 Google 表格。 A 随着许多重复项(基于粗略的时间戳)单调增加,而B 本质上是随机的。底部有许多空行等待未来的数据。它类似于以下内容:

     A   B
 1   5  43
 2   5  77
 3  13   8
 4  21  34
 5  27  68
 6  27  90
 7
 8
 9
10

我正在尝试编写一些公式来检查列中的所有(非空)值除了最后一个。比如我想求B不包括最新值的最大值,所以结果应该是B2中的77,而不是B6中的90

如果范围内的值严格递增且唯一,我可以将A 的值过滤到C,排除等于最大值的任何值(仅最后一个条目),然后取@987654331那个范围的@。但是,我的数据不具有该属性;最终值可能会被重复,并且会不恰当地忽略重复的值。

     C                             D          E
 1   =FILTER(A:A, A:A < MAX(A:A))  =MAX(C:C)  This produces A4's 21 instead of A5's 27.

如果我们要使用第三列递增索引,则类似的方法会起作用:

     A   B   C   D                              E
 1   5  43   9   =MAX(FILTER(C:C, A:A <> ""))   Value of index in last populated row.
 2   5  77  10   =MAX(FILTER(A:A, C:C < D1))    Maximum value from a row with lower index.
 3  13   8  11
 4  21  34  12
 5  27  68  13
 6  27  90  14
 7          15
 8          16
 9          17
10          18

但我正在寻找一种不需要修改原始电子表格的解决方案,因为这并不总是可行的。我不能只用一个索引列创建一个新的IndexSheet,然后像这样加入它......

     A   B   C
 1   5  43   =MAX(FILTER(IndexSheet!A:A, A:A <> ""))
 2   5  77   =MAX(FILTER(A:A, IndexSheet!A:A < C1))
...

...因为这要求IndexSheet 具有与数据表相同的行数,并且会随着更多数据的添加而中断。

在不修改原始数据表的情况下,或依赖数据的属性(除了数值为数字和行为空或满),有没有办法在排除最后一个值的同时对一个范围执行聚合计算?

【问题讨论】:

    标签: google-sheets


    【解决方案1】:

    您可以使用indirectaddress 公式创建不包括最后一行的动态范围

    =max(indirect("A1:"&Address(count(A:A)-1,1)))
    

    count 函数给出 A 列中非空单元格的数量。减去 1 以排除最后一行。

    您使用该号码使用"A1:"&amp;address(row no, Col no) 构建地址,在您的示例中应该是A1:$A$5

    使用此字符串通过间接方法indirect(A1:$A$5) 引用您的单元格,并将引用传递给max 函数以确定该范围内的最大值。

    【讨论】:

      【解决方案2】:

      从另一张纸试试:

      =MAX(Sheet1!B1:indirect("Sheet1!B"&count(Sheet1!B:B)-1))
      

      【讨论】:

        【解决方案3】:

        我们可以使用FILTER()ROW() 函数来完成这个:

           D
         1 =MAX(FILTER(Data!A:A,
                       ROW(Data!A:A) < MAX(FILTER(ROW(Data!A:A),
                                                  Data!A:A <> ""))))
        

        我们使用FILTER(ROW(DATA!A:A), Data!A:A &lt;&gt; "")) 获取非空行的行号数组,并使用MAX(...) 获取最后一个行号。我们通过使用FILTER(Data!A:A, ROW(Data!A:A) &lt; ...) 过滤掉较低行号中的值来使用它来排除最后一行。我们将MAX(...) 应用于这个过滤后的数组并得到我们正在寻找的结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-13
          • 1970-01-01
          • 1970-01-01
          • 2017-04-30
          • 2021-11-26
          • 1970-01-01
          相关资源
          最近更新 更多