如何在BigQuery中将不同行的指定列数据去重拼接为一行
解决多值列的唯一名字拼接问题
这个问题我之前也碰到过!核心问题在于你直接对整个Name单元格使用distinct,但每个单元格本身就包含逗号分隔的多个名字,distinct只会过滤完全重复的单元格内容,没法拆分里面的单个名字去重,所以才会出现重复的单个名字。
下面给你两种可行的解决方案:
方案一:针对固定分隔符(, )拆分去重
如果你的Name列里的名字都是用逗号加空格分隔的,可以直接用这个SQL:
SELECT string_agg(DISTINCT split_name, ', ') AS unique_names FROM ( -- 把每个单元格的名字拆成单独的行 SELECT unnest(string_to_array(Name, ', ')) AS split_name FROM your_table_name -- 替换成你的表名 ) AS split_names;
这段SQL的逻辑很简单:
- 子查询里用
string_to_array把每个Name单元格转成数组,再用unnest把数组拆成单独的行,每个行对应一个名字; - 外层查询对拆分后的单个名字做
DISTINCT去重,最后用string_agg拼接成逗号分隔的字符串。
方案二:兼容多种分隔符(比如逗号后有无空格)
如果你的数据里存在逗号后没有空格的情况(比如偶尔出现Jack,John这种格式),可以加上trim来处理名字前后的空格:
SELECT string_agg(DISTINCT trim(split_name), ', ') AS unique_names FROM ( -- 先按逗号拆分,再用trim去掉每个名字的前后空格 SELECT unnest(string_to_array(Name, ',')) AS split_name FROM your_table_name -- 替换成你的表名 ) AS split_names;
这样不管是, 还是,作为分隔符,都能正确拆分并清理掉名字的多余空格,再去重拼接。
这两种方法都能得到你想要的Jack, John, Julie结果~
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

