2

我在 Google Groups 上遇到了以下关于在聚合中选择第一个/最后一个值的能力的旧讨论:

https://groups.google.com/forum/?fromgroups=#!msg/bigquery-discuss/1WAJw1UC73w/_RbUCsMIvQ4J

我想知道给出的答案是否仍然是最新的。更具体地说,是否有可能在不进行 JOIN 或使用嵌套记录的情况下执行以下操作:
SELECT foo, LAST(bar) last_bar FROM table GROUP BY foo HAVING last_bar = b
用于下表:

foo, bar  
1, a  
1, b  
2, b  
2, c  
3, b

会返回:

foo, last_bar  
1, b  
3, b 

如果不可能,我正在考虑使用以下组合来做同样的事情

GROUP_CONCATREGEXP_MATCH在连接结束时:

SELECT foo, GROUP_CONCAT(bar) concat_bar from table GROUP BY foo HAVING REGEXP_MATCH(concat_bar, "b$")  

但这仅在按行的顺序进行聚合时才有效。是这样吗?

4

3 回答 3

4

我喜欢使用数组聚合来获取第一个/最后一个值:

SELECT foo, ARRAY_AGG(bar)[OFFSET(0)] AS bar FROM test GROUP BY foo;

您还可以添加LIMIT到聚合:ARRAY_AGG(bar LIMIT 1)以使其更快。

ORDER BY如果要按列对其进行排序或获取最后一个值,则 可以使用它:ARRAY_AGG(bar ORDER BY foo DESC)

你也可以过滤掉空值ARRAY_AGG(bar IGNORE NULLS)

于 2020-01-18T00:33:26.437 回答
2

我试图解决类似的问题并使用 GROUP_CONCAT 得出相同的结论

试试这个:

SELECT foo, REGEXP_REPLACE(group_concat(bar),".*,","") as last_bar 
FROM [dataset.table] 
GROUP BY foo
于 2012-10-10T19:31:38.073 回答
0

无法保证存储在 BigQuery 中的记录的顺序,因此这可能会在某些时候失败。“最后一个条目”会永远是最大的吗?如果是这样,也许以下是您正在寻找的?

SELECT foo, MAX(bar) FROM test GROUP BY foo
于 2012-10-18T23:14:36.707 回答