You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery技术问询:内容相同的多行SQL数据合并为单行

嘿,在BigQuery里把多行匹配的数据合并成单行其实是个挺常见的需求,我来给你分享几个实用的方法,分不同场景来看:

1. 合并字符串到单行(最常用场景)

如果你的需求是把同一分组下的文本内容拼接成一个字符串,用STRING_AGG()函数就搞定了。它支持自定义分隔符,还能排序、去重。

举个实际例子:假设你有一张user_purchases表,记录了用户的购买记录,结构如下:

user_idproduct_name
101手机
101耳机
102电脑

要把每个用户的所有商品合并成一行,SQL可以这么写:

SELECT
  user_id,
  STRING_AGG(product_name, ', ' ORDER BY product_name) AS purchased_products
FROM
  `your-project.your-dataset.user_purchases`
GROUP BY
  user_id

结果会是:

user_idpurchased_products
101耳机, 手机
102电脑

如果要去重(比如用户重复买了同一个商品),只需要在字段前加DISTINCT:STRING_AGG(DISTINCT product_name, ', ')

2. 合并为数组(保留结构化数据)

如果不想把内容变成纯字符串,而是保留数组格式方便后续处理,就用ARRAY_AGG()函数。它会把同一分组下的字段值打包成一个数组。

还是用上面的表,要得到每个用户的商品数组:

SELECT
  user_id,
  ARRAY_AGG(product_name ORDER BY product_name) AS products_array
FROM
  `your-project.your-dataset.user_purchases`
GROUP BY
  user_id

结果里的products_array字段就是["耳机", "手机"]这样的数组类型,后续可以用UNNEST()展开,或者用数组函数操作。

3. 合并复杂结构为JSON

如果每行有多个字段需要合并,比如要把用户的所有购买记录(包含商品名、价格、日期)合并成JSON数组,就可以结合TO_JSON_STRING()和ARRAY_AGG():

假设表结构多了price和purchase_date字段:

user_idproduct_namepricepurchase_date
101手机39992024-01-05
101耳机2992024-01-06

合并成JSON数组的SQL:

SELECT
  user_id,
  ARRAY_AGG(TO_JSON_STRING(STRUCT(product_name, price, purchase_date))) AS purchase_records
FROM
  `your-project.your-dataset.user_purchases`
GROUP BY
  user_id

结果里的purchase_records会是包含多个JSON字符串的数组,每个元素对应一条购买记录的完整信息。

一些注意点
  • 处理NULL值:如果字段可能为空,可以用IFNULL()包裹,比如STRING_AGG(IFNULL(product_name, '无商品'), ', ')
  • 控制结果长度:STRING_AGG()默认有长度限制,如果内容太长,可以加LIMIT参数,比如STRING_AGG(product_name, ', ' LIMIT 10)只取前10个值

内容的提问来源于stack exchange,提问作者cimmeria luz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:45:20