如何在BigQuery中将多行数据转换为多列格式?
行转列:将同一交易ID的多行列转为多列字段
当前数据表:
| transaction_id | transaction_name | transaction_amount |
|---|---|---|
| 123 | item_1 | 200 |
| 123 | item_2 | 100 |
| 124 | item_1 | 200 |
| 124 | item_2 | 300 |
| 124 | item_3 | 400 |
期望输出表:
| transaction_id | transaction_name_1 | transaction_amount_1 | transaction_name_2 | transaction_amount_2 | transaction_name_3 | transaction_amount_3 |
|---|---|---|---|---|---|---|
| 123 | item_1 | 200 | item_2 | 100 | NULL | NULL |
| 124 | item_1 | 200 | item_2 | 300 | item_3 | 400 |
解决方案:窗口函数+条件聚合
这个需求属于**行转列(Pivot)**操作,核心是先给同一交易ID下的记录分配序号,再通过条件聚合将不同序号的字段转为对应列,兼容性覆盖多数主流数据库。
步骤1:给交易ID下的行分配序号
用ROW_NUMBER()窗口函数,按transaction_id分组,给每条记录生成唯一序号:
SELECT transaction_id, transaction_name, transaction_amount, ROW_NUMBER() OVER (PARTITION BY transaction_id ORDER BY transaction_name) AS row_num FROM your_table_name;
执行后会得到带序号的中间结果,比如transaction_id=123的两条记录序号为1、2,transaction_id=124的三条记录序号为1、2、3。
步骤2:条件聚合生成目标列
基于中间结果,用MAX(CASE ...)聚合生成对应列:
SELECT transaction_id, MAX(CASE WHEN row_num = 1 THEN transaction_name END) AS transaction_name_1, MAX(CASE WHEN row_num = 1 THEN transaction_amount END) AS transaction_amount_1, MAX(CASE WHEN row_num = 2 THEN transaction_name END) AS transaction_name_2, MAX(CASE WHEN row_num = 2 THEN transaction_amount END) AS transaction_amount_2, MAX(CASE WHEN row_num = 3 THEN transaction_name END) AS transaction_name_3, MAX(CASE WHEN row_num = 3 THEN transaction_amount END) AS transaction_amount_3 FROM ( SELECT transaction_id, transaction_name, transaction_amount, ROW_NUMBER() OVER (PARTITION BY transaction_id ORDER BY transaction_name) AS row_num FROM your_table_name ) AS numbered_rows GROUP BY transaction_id;
补充说明
- 如果交易ID下的记录数超过3条,只需对应增加
row_num=N的CASE语句即可。 - 代码中的
ORDER BY transaction_name可根据实际需求调整排序规则(比如按交易金额排序)。 - 部分数据库(如SQL Server、Oracle)支持原生
PIVOT语法,但上述条件聚合写法兼容性更强,适用于MySQL、PostgreSQL等多数数据库。
内容的提问来源于stack exchange,提问作者Iren Ramadhan
相关产品推荐
相关产品推荐

