Google analytics Bigquery:将多列数据转换为行格式
假设BQ中有下表: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
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