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<>""))
对于每个电子邮件 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<>""))