BigQuery技术问询:内容相同的多行SQL数据合并为单行
嘿,在BigQuery里把多行匹配的数据合并成单行其实是个挺常见的需求,我来给你分享几个实用的方法,分不同场景来看:
1. 合并字符串到单行(最常用场景)
如果你的需求是把同一分组下的文本内容拼接成一个字符串,用STRING_AGG()函数就搞定了。它支持自定义分隔符,还能排序、去重。
举个实际例子:假设你有一张user_purchases表,记录了用户的购买记录,结构如下:
| user_id | product_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_id | purchased_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_id | product_name | price | purchase_date |
|---|---|---|---|
| 101 | 手机 | 3999 | 2024-01-05 |
| 101 | 耳机 | 299 | 2024-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
相关产品推荐
相关产品推荐

