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

如何在BigQuery中对数据执行Pivot/转置操作?

BigQuery实现行转列(Pivot)方案

针对你的需求,用BigQuery的PIVOT语法就能直接实现行转列,以下分两种场景给出最优写法:

场景1:Metrics值固定(已知是metric a、b、c)

如果你的metrics取值是固定的,直接用静态PIVOT即可,代码清晰高效:

SELECT 
  uuid,
  `metric a`,
  `metric b`,
  `metric c`
FROM (
  -- 先筛选出需要用到的核心字段,排除无关的project_id、project_name
  SELECT uuid, metrics, values 
  FROM your_table_name -- 替换成你的实际表名
)
PIVOT (
  -- 因为每个uuid+metrics组合唯一,用MAX/MIN/SUM都能得到正确值,这里选MAX
  MAX(values)
  -- 指定要转成列的metrics取值
  FOR metrics IN ('metric a', 'metric b', 'metric c')
)
ORDER BY uuid;

场景2:Metrics值动态(未来可能新增)

如果后续metrics会新增取值,不想每次修改SQL,可以用动态SQL自动生成PIVOT语句:

DECLARE metrics_list STRING;

-- 自动获取所有不重复的metrics值,拼接成IN子句需要的格式
SET metrics_list = (
  SELECT STRING_AGG(DISTINCT CONCAT("'", metrics, "'"), ', ')
  FROM your_table_name
);

-- 动态生成并执行PIVOT SQL
EXECUTE IMMEDIATE FORMAT("""
  SELECT uuid, %s
  FROM (
    SELECT uuid, metrics, values 
    FROM your_table_name
  )
  PIVOT (
    MAX(values)
    FOR metrics IN (%s)
  )
  ORDER BY uuid
""", 
-- 把metrics值转成带反引号的列名,处理空格问题
(SELECT STRING_AGG(DISTINCT CONCAT("`", metrics, "`"), ', ') FROM your_table_name),
metrics_list
);

关键说明

  • PIVOT必须配合聚合函数使用,因为SQL需要处理分组后的聚合逻辑,这里每个uuid+metrics只有一个值,所以任意聚合函数(MAX/MIN/SUM)结果都一致
  • 列名包含空格时,必须用反引号`包裹,否则会报错
  • 动态SQL适合metrics不固定的场景,能自动适配新增的metrics值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:35:35