我在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_CONCAT
和REGEXP_MATCH
:
SELECT foo, GROUP_CONCAT(bar) concat_bar from table GROUP BY foo HAVING REGEXP_MATCH(concat_bar, "b$")
但只有在按行的顺序进行聚合时才有效。是这样的吗?
答案 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 BY
:
ARRAY_AGG(bar ORDER BY foo DESC)
您还可以使用ARRAY_AGG(bar IGNORE NULLS)
过滤空值