在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
相关产品推荐
相关产品推荐

