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

在BigQuery中实现行转列(Pivot)遇到问题,求解决方案

解决BigQuery中行转列的问题

我来帮你搞定这个行转列的需求!你需要把每个Zipcode对应的多条dcode和dname分别转换成带编号的列(比如dcode1、dcode2,dname1、dname2),对吧?结合你的数据集,这里用条件聚合的方式在BigQuery里就能实现,具体方案如下:

步骤说明

首先我们需要给每个Zipcode分组内的行分配一个序号,然后通过条件判断提取对应序号的dcode和dname,最后聚合得到目标格式。

具体SQL代码

WITH numbered_rows AS (
  SELECT
    Zipcode,
    dcode,
    dname,
    -- 给每个Zipcode下的行按dcode排序并分配序号
    ROW_NUMBER() OVER(PARTITION BY Zipcode ORDER BY dcode) AS rn
  FROM `your-project.your-dataset.table1` -- 替换成你的实际项目和数据集名
)
SELECT
  Zipcode,
  -- 提取第1个dcode
  MAX(CASE WHEN rn = 1 THEN dcode END) AS dcode1,
  -- 提取第2个dcode(如果存在)
  MAX(CASE WHEN rn = 2 THEN dcode END) AS dcode2,
  -- 提取第1个dname
  MAX(CASE WHEN rn = 1 THEN dname END) AS dname1,
  -- 提取第2个dname(如果存在)
  MAX(CASE WHEN rn = 2 THEN dname END) AS dname2
FROM numbered_rows
GROUP BY Zipcode
ORDER BY Zipcode DESC; -- 按Zipcode排序,和你的示例顺序一致

结果说明

执行这段代码后,会得到你想要的格式:

  • 对于009,会显示dcode1=512、dcode2=513,dname1=Albany、dname2=springfield
  • 对于008,因为只有一条数据,dcode2和dname2会显示为NULL,如果想让这些列显示为空字符串,可以把MAX(CASE...)改成MAX(COALESCE(CASE..., ''))
  • 对于007,会显示dcode1=345、dcode2=346,dname1=place2、dname2=place3

扩展说明

如果你的数据里某个Zipcode可能有超过2条记录,只需要继续添加对应的MAX(CASE WHEN rn=3 THEN ...)语句即可,灵活适配更多条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:12:36