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

如何在BigQuery中将多行数据转换为多列格式?

行转列:将同一交易ID的多行列转为多列字段

当前数据表:

transaction_idtransaction_nametransaction_amount
123item_1200
123item_2100
124item_1200
124item_2300
124item_3400

期望输出表:

transaction_idtransaction_name_1transaction_amount_1transaction_name_2transaction_amount_2transaction_name_3transaction_amount_3
123item_1200item_2100NULLNULL
124item_1200item_2300item_3400

解决方案:窗口函数+条件聚合

这个需求属于**行转列(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:11:06