在执行GROUP BY时获取聚合中的第一个或最后一个项目

时间:2012-10-09 19:50:47

标签: google-bigquery

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

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$")  

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

3 个答案:

答案 0 :(得分:1)

我试图解决类似的问题,并使用GROUP_CONCAT

得出相同的结论

尝试一下:

SELECT foo, REGEXP_REPLACE(group_concat(bar),".*,","") as last_bar 
FROM [dataset.table] 
GROUP BY foo

答案 1 :(得分:0)

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

SELECT foo, MAX(bar) FROM test GROUP BY foo

答案 2 :(得分:0)

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

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

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

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

您还可以使用ARRAY_AGG(bar IGNORE NULLS)过滤空值