【问题标题】:Google Sheets Query Group By / First-N-Per-GroupGoogle 表格查询分组方式/First-N-Per-Group
【发布时间】:2018-09-09 08:50:22
【问题描述】:

我正在尝试为 first-n-per-group 找到一个简单的解决方案。

我有一个数据表,第一列日期和剩余数据。我想根据日期进行分组,因为每个日期允许多个条目。对于第二列一些数字,但想要 FIRST 记录。

目前我可能使用的聚合函数是 MIN() 但这将返回最小值而不是第一个值。

A            B
01/01/2018   10
01/01/2018   15
02/01/2018   10
02/01/2018   2
02/01/2018   100
02/01/2018   20
03/01/2018   5
03/01/2018   2

期望的输出

A            B
01/01/2018   10
02/01/2018   10
03/01/2018   5

使用 MIN() 的当前结果 - 不需要

A            B
01/01/2018   10
02/01/2018   2
03/01/2018   2

很遗憾,Google 表格中没有 FIRST() 聚合函数,这会使这变得容易得多。

我看到了几个使用 Row Number 和 ArrayQuery 的示例,但这似乎对我不起作用。大约有 5000 行数据,因此尽量保持高效,并且不必在任何更改时重新计算整个工作表,每次都需要几秒钟。

目前我有这个,它在第三列附加了行号:

=query({A1:B, arrayformula(row(A1:B))}, "select min(Col1),min(Col2) group by Col1")

谢谢


编辑 1


建议的解决方案是=SORTN(A:B,2^99,2,1,1),这是一个干净简单的解决方案。但是,这需要大范围的“可用空间”来显示返回的数据集。想象一下 3000 多行。

我希望有一个基于 QUERY() 的解决方案,因为我想对结果进行进一步的操作。具体来说,计算不同值的出现次数。

例如:我想要一个返回的数据集

A            B
01/01/2018   10
02/01/2018   10
03/01/2018   5

但我想计算这些值的出现次数(然后忽略日期)。例如:

B    C
10   2
5    1

也许我用数字混淆了情况? ColB 中的“数据”是 TEXT(短 3 个字母代码),但是我用数字表明我不能使用 MIN() 函数,因为它返回数字最小值。

简而言之:

  • 遍历所有行(3000 多行)并按特定日期的第一行分组
  • 返回该行的第一个值
  • COUNT() 所有唯一出现的这些 FIRST 值,不考虑日期。只是一个包含唯一值及其计数的列表(同样,只有任何特定日期的第一个)

【问题讨论】:

    标签: google-sheets google-query-language google-sheets-query


    【解决方案1】:
    =SORTN(A:B,2^99,2,1,1)
    

    如果您的数据按照示例中的方式排序,您可以使用 SORTN() 轻松删除重复项

    【讨论】:

    • 完美。即使数据未按所示排序也不行吗,因为顺序保留在每个日期内?
    • 效果很好,谢谢。我问这个最初是希望有一个 QUERY() 解决方案,因为我计划使用该结果集和 GROUP BY 每个返回的值并返回一个唯一值的 COUNT()...
    • 我也在想这个问题和其他类似的问题本可以更简单地回答...stackoverflow.com/questions/52242856/…
    • @Jammo 您可以将其嵌套在查询中。 =query(sortn(),"select...")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2013-09-05
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多