Google 张使用 Arrayformula 的查询函数

Google sheets Query function with Arrayformula

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

在另一个 sheet 上试试这个,第 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 <= 10 来调整找到的记录数,也可以通过更改公式末尾的 order by Col1 来调整最终排序。

说明

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

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

countifs(<EmailColumnData>,<EmailColumnData>,row(<EmailColumn>),"<="&row(<EmailColumn>))

代替 COUNTIF() 中的 <EmailColumnData> 是: query({Sheet1!$A2:$C},"select Col2 order by Col1 desc,Col2",0)

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

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

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

围绕所有内容的最终查询获取我们需要的 3 列,其中第 4 列中的计数 <=10,然后按 Col1(日期升序)对输出进行排序。

我在 A1 中使用以下公式添加了一个新的 sheet(“Erik Help”):

=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<>""))),Sheet1!A2:A&"|"&Sheet1!B2:B&"|"&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 列倒序排序”,按照当前设置,按 date/time 倒序排序) .

转念一想,也许这有点厚颜无耻,但这可能会做到(摘自 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<>""))