如何在BigQuery中将多行合并为含有序去重值的单行?
解决BigQuery多行数据合并为单行的问题
我来帮你搞定这个多行合并的需求!首先梳理下你的问题:你想按A和B分组,把同一组里的C(示例里都是math)保留为单个值,D列合并去重后的内容,但之前的代码因为窗口函数的误用和语法问题,导致结果不符合预期还报错。
错误原因分析
你之前用了group_concat(unique(C),",") over(partition by A, B ORDER BY C)这类写法,问题主要出在两点:
- 窗口函数的特性:
OVER()子句是用来对每行数据做计算的,不会把整个分组聚合为一行,所以会重复输出C的值; - 语法与函数选择:BigQuery里更推荐使用标准的
STRING_AGG函数来合并字符串,而且去重应该用DISTINCT关键字,unique不是BigQuery的标准用法,这也是报错的原因之一。
正确的SQL写法
根据你的需求,我们需要用GROUP BY来做分组聚合,而不是窗口函数。因为示例中同一A、B分组下C的值都是math,所以可以用ANY_VALUE(或者MAX/MIN,结果都一致)来保留单个C值;D列则用STRING_AGG(DISTINCT D, ', ')来合并去重后的内容:
SELECT A, B, ANY_VALUE(C) AS C, STRING_AGG(DISTINCT D, ', ') AS D FROM `你的项目名.数据集名.目标表名` GROUP BY A, B ORDER BY A, B
如果你的实际场景中,同一A、B分组下C可能有多个不同值,想要合并去重的C,只需要把C的部分改成STRING_AGG(DISTINCT C, ', ') AS C即可。
执行这段SQL后,就能得到你期望的结果:
A | B | C | D
09-10-2019 | 1 | math | science, social
内容的提问来源于stack exchange,提问作者Fairuz Yassar
相关产品推荐
相关产品推荐

