Google analytics Bigquery:将多列数据转换为行格式

Google analytics Bigquery:将多列数据转换为行格式,google-analytics,google-bigquery,Google Analytics,Google Bigquery,假设BQ中有下表: SELECT "Desktop" AS Device, 24 AS col1, 9 AS col2, 28 AS col3, 7 AS col4, 98 AS col5, 77 AS col6, 59 AS col7 UNION ALL SELECT "Mobile" AS Device, 8 AS col1, 43 AS col2, 75 AS col3, 44 AS col4, 38 AS col5, 31 AS col6, 46 AS col7 UNION ALL SE

假设BQ中有下表:

SELECT "Desktop" AS Device, 24 AS col1, 9 AS col2, 28 AS col3, 7 AS col4, 98 AS col5, 77 AS col6, 59 AS col7 UNION ALL
SELECT "Mobile" AS Device, 8 AS col1, 43 AS col2, 75 AS col3, 44 AS col4, 38 AS col5, 31 AS col6, 46 AS col7 UNION ALL
SELECT "Tablet" AS Device, 7 AS col1, 9 AS col2, 34 AS col3, 86 AS col4, 62 AS col5, 69 AS col6, 74 AS col7
因此,该表可以大到大约100列

我想转换此查询,以便将其作为结果表:

SELECT "Desktop" AS Device, 24 AS Nr UNION ALL
SELECT "Desktop" AS Device, 9 AS Nr UNION ALL
SELECT "Desktop" AS Device, 28 AS Nr UNION ALL
SELECT "Desktop" AS Device, 7 AS Nr UNION ALL
SELECT "Desktop" AS Device, 98 AS Nr UNION ALL
SELECT "Desktop" AS Device, 77 AS Nr UNION ALL
SELECT "Desktop" AS Device, 59 AS Nr UNION ALL
SELECT "Mobile" AS Device, 8 AS Nr UNION ALL
SELECT "Mobile" AS Device, 43 AS Nr UNION ALL
SELECT "Mobile" AS Device, 75 AS Nr UNION ALL
Etc

有人知道如何做到这一点吗?

您可以将数字列转换为一个数组,并使用UNNEST:

with raw as (
SELECT "Desktop" AS Device, 24 AS col1, 9 AS col2, 28 AS col3, 7 AS col4, 98 AS col5, 77 AS col6, 59 AS col7 UNION ALL
SELECT "Mobile" AS Device, 8 AS col1, 43 AS col2, 75 AS col3, 44 AS col4, 38 AS col5, 31 AS col6, 46 AS col7 UNION ALL
SELECT "Tablet" AS Device, 7 AS col1, 9 AS col2, 34 AS col3, 86 AS col4, 62 AS col5, 69 AS col6, 74 AS col7
)
select Device,  Nr
from raw
left join UNNEST ([col1, col2, col3,col4,col5,col6,col7]) Nr

下面是BigQuery标准SQL,这里的额外优势在于它不依赖于要取消激活的列的数量和名称

#standardSQL
WITH raw AS (
  SELECT "Desktop" AS Device, 24 AS col1, 9 AS col2, 28 AS col3, 7 AS col4, 98 AS col5, 77 AS col6, 59 AS col7 UNION ALL
  SELECT "Mobile" AS Device, 8 AS col1, 43 AS col2, 75 AS col3, 44 AS col4, 38 AS col5, 31 AS col6, 46 AS col7 UNION ALL
  SELECT "Tablet" AS Device, 7 AS col1, 9 AS col2, 34 AS col3, 86 AS col4, 62 AS col5, 69 AS col6, 74 AS col7
)
SELECT Device, Nr FROM raw t, 
UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING((SELECT AS STRUCT * EXCEPT(Device) FROM UNNEST([t]))), r'":([^,}]*)')) Nr 
OP评论更新:我完全忘了在要求中包括列名也应该作为一个单独的列添加

如果应用于相同的采样数据,结果如下所示

Row Device  col     Nr   
1   Desktop col1    24   
2   Desktop col2    9    
3   Desktop col3    28   
4   Desktop col4    7    
5   Desktop col5    98   
6   Desktop col6    77   
7   Desktop col7    59   
8   Mobile  col1    8    
9   Mobile  col2    43   
10  Mobile  col3    75   
11  Mobile  col4    44   
12  Mobile  col5    38   
13  Mobile  col6    31   
14  Mobile  col7    46   
15  Tablet  col1    7    
16  Tablet  col2    9    
17  Tablet  col3    34   
18  Tablet  col4    86   
19  Tablet  col5    62   
20  Tablet  col6    69   
21  Tablet  col7    74   

Thnx Mikhail,在有许多列的情况下非常方便。但是,我完全忘记了在要求中包括列名也应作为单独的列添加,因此我知道,例如,第一行的值24与“col1”匹配。这也是可能的吗?那你为什么接受之前的答案呢?不管怎样,发布你的新问题或用你真正需要的东西更新这个问题,我会分别回答或更新我的答案。同时,请考虑投票,至少在我的回答中看到更新,请不要。别忘了投票,米哈伊尔,为了回答你的问题,我接受了前面的答案,因为它符合我最初的要求。我的附加要求是后来才提出的,我第一次答复了您的代码。我会考虑你的反馈,下一次我会发表一篇新的帖子。不管怎样,谢谢你的更新代码,这很好用。当然,没问题,明白了吗
Row Device  col     Nr   
1   Desktop col1    24   
2   Desktop col2    9    
3   Desktop col3    28   
4   Desktop col4    7    
5   Desktop col5    98   
6   Desktop col6    77   
7   Desktop col7    59   
8   Mobile  col1    8    
9   Mobile  col2    43   
10  Mobile  col3    75   
11  Mobile  col4    44   
12  Mobile  col5    38   
13  Mobile  col6    31   
14  Mobile  col7    46   
15  Tablet  col1    7    
16  Tablet  col2    9    
17  Tablet  col3    34   
18  Tablet  col4    86   
19  Tablet  col5    62   
20  Tablet  col6    69   
21  Tablet  col7    74