【问题标题】:Google sheets Query function with Arrayformula带有 Arrayformula 的 Google 表格查询功能
【发布时间】:2021-07-09 07:00:54
【问题描述】:

对于每个电子邮件 ID,我想按时间戳获取最新的 10 条记录。我如何使用arrayformula? 查询函数获得结果并不重要,只要我仍然可以使用 arrayformula 实现这一点。这是示例数据: https://docs.google.com/spreadsheets/d/1YAHA02VM-5MXzVKhkxu_eODPKObpoz441mGX8lOFu5M/edit?usp=sharing

【问题讨论】:

    标签: google-sheets array-formulas


    【解决方案1】:

    在另一张纸上试试这个,第 1 行:

    =arrayformula(query({query({Sheet1!$A:$C},"order by Col1 desc,Col2",1),{"Dupe position";countifs(query({Sheet1!$A2:$C},"select Col2 order by Col1 desc,Col2",0),query({Sheet1!$A2:$C},"select Col2 order by Col1 desc,Col2",0),row(Sheet1!$A2:$C),"<="&row(Sheet1!$A2:$C))}},"select Col1,Col2,Col3 where Col1 is not null and Col4 <= 10 order by Col1",1))
    

    您可以通过调整Col4 &lt;= 10来调整找到的记录数,也可以通过更改公式末尾的order by Col1来调整最终排序。

    说明

    这从 Sheet1 获取数据,按日期 desc 排序,然后通过电子邮件 asc: query({Sheet1!$A:$C},"order by Col1 desc,Col2",1)

    然后在该数据的旁边,COUNTIFS() 用于获取每次电子邮件出现在上面的列表中时的数字(因为它是降序排序的,1 代表最近的实例)。

    countifs(&lt;EmailColumnData&gt;,&lt;EmailColumnData&gt;,row(&lt;EmailColumn&gt;),"&lt;="&amp;row(&lt;EmailColumn&gt;))

    COUNTIF() 中的&lt;EmailColumnData&gt; 是: query({Sheet1!$A2:$C},"select Col2 order by Col1 desc,Col2",0)

    代替上面的&lt;EmailColumn&gt;,我们只需要行号,所以我们不需要实际数据。我们可以用: Sheet1!$A2:$C

    各种{} 作为数组将数据汇集在一起​​。

    例如,{a,b,c;d,e,f} 将产生三列,a, b, c 在第 1 行,d, e, f 在第 2 行。, 是一个新列,; 是一个新行的返回。

    对所有内容的最终查询得到我们需要的 3 列,其中 col 4 中的计数为

    【讨论】:

    • 谢谢,这可以完成工作,但操作起来很复杂
    • 我已经添加了解释。还在“Aresvik 解决方案”选项卡上的工作表中添加了额外的“帮助”列,以便您查看发生了什么。 3 个黄色单元格中的公式组合在绿色单元格中。
    • 这是一个巧妙解决棘手问题的方法,而且可能非常简单。
    • 谢谢。我的直觉是,可能有一种更简单的方法,但最终除了计算每封电子邮件的实例之外,我看不到任何其他选择。
    【解决方案2】:

    再想一想,也许这有点厚颜无耻,但这可能会做到(取自conditional rank idea

    =ArrayFormula(filter(A2:C,countifs(A2:A,">="&A2:A,B2:B,B2:B)<=10,A2:A<>""))
    

    编辑

    以上假设(因为数据带有时间戳)不应该发生重复。如果他们这样做并且数据已预先排序,您可以按照@Aresvik 的建议使用行号作为时间戳的代理。

    或者,您可以单独计算

    (a) 仅具有较晚时间戳的行

    (b) 具有相同时间戳但具有较早(或相同)行号的行

    =ArrayFormula(filter(A2:C,countifs(A2:A,">"&A2:A,B2:B,B2:B)+countifs(A2:A,"="&A2:A,B2:B,B2:B,row(A2:A),"<="&row(A2:A))<=10,A2:A<>""))
    

    【讨论】:

    • 优秀的解决方案。不太可能,但如果 A 中的值并非都是唯一的,那么您可以使用 row(),并仅引用 B。 --> countifs(row(B2:B),"&gt;="&amp;row(B2:B),B2:B,B2:B)
    【解决方案3】:

    我在 A1 中添加了一个带有以下公式的新工作表(“Erik 帮助”):

    =ArrayFormula({"Submitted Time","Email","Score";SORT(SPLIT(FLATTEN(QUERY(SORT(TRANSPOSE(SPLIT(TRANSPOSE(QUERY(IF(Sheet1!B2:B=TRANSPOSE(UNIQUE(FILTER(Sheet1!B2:B,Sheet1!B2:B&lt;&gt;""))),Sheet1!A2:A&amp;"|"&amp;Sheet1!B2:B&amp;"|"&amp;Sheet1!C2:C,),,COUNTA(Sheet1!A2:A)))," ",0,1)),SEQUENCE(MAX(COUNTIF(Sheet1!B2:B,Sheet1!B2:B))),0),"LIMIT 10")),"|",1,0),1,0)})

    记录数设置在LIMIT之后。

    顺序由最后两个数字设置:1,0(意思是“按第 1 列倒序排序”,当前设置为按日期/时间倒序排序)。

    【讨论】:

    • 谢谢埃里克!这样就可以了。不幸的是,它非常复杂
    • 请记住,这个论坛(以及任何其他类似的论坛)完全由志愿者在我们的空闲时间运行。论坛旨在为许多人提供一点知识或“朝正确方向轻推”。大多数情况下,为论坛创建解决方案只需要几分钟,而且解释也相当简单。在这种情况下,创建解决方案所花费的时间比通常情况要多得多;详细解释将需要更多时间。看来 Aresvik 确实选择为你投入额外的时间;但是我自己的常规付费客户负担太重了,我现在无法这样做。
    • 理解并感谢您的贡献
    猜你喜欢
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2021-01-18
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多