Google Firebase 和大查询:SQL 数组到列
Google Firebase and Big Query : SQL Array to Columns
我正在尝试拆分作为事件参数的字符串 ("item1,item2,item3") (key = "to_split", value.string_value = "item1,item2,item3" ) 到 Google BigQuery 中的多个列。
目前,我有:
SELECT
event_name,
PARSE_DATE("%Y%m%d", event_date) as date,
TIMESTAMP_MICROS(event_timestamp) as timestamp,
(
SELECT split(params.value.string_value, ',')
FROM UNNEST(event_params) as params
WHERE key = 'event_param-key_to_filter'
),
FROM `firebase.analytics.table`
这将给出如下结果:
event_name
日期
时间戳
f0_
示例事件
2021-06-15
2021-06-15 10:08:41.634055 UTC
Item\nItem\nItem\nItem
(格式化不喜欢,但拆分将项目变成数组)
我正在努力获得这样的结果:
event_name
日期
时间戳
item0
item1
item2
项目...
示例事件
2021-06-15
2021-06-15 10:08:41.634055 UTC
项目
项目
项目
等...
对于 BigQuery,是否有一种好的方法可以将此项目数组沿 SQL 中的同一行拆分为多个列?我已经坚持了很长一段时间。
最佳
您可以使用数组引用:
SELECT t.*,
items[SAFE_ORDINAL(1)] as item_1,
items[SAFE_ORDINAL(2)] as item_2,
items[SAFE_ORDINAL(3)] as item_3,
items[SAFE_ORDINAL(4)] as item_4
FROM (SELECT event_name, PARSE_DATE("%Y%m%d", event_date) as date,
TIMESTAMP_MICROS(event_timestamp) as timestamp,
(SELECT split(params.value.string_value, ',')
FROM UNNEST(event_params) as params
WHERE key = 'event_param-key_to_filter'
) items
FROM `firebase.analytics.table` t
) t
考虑以下
select * from (
select * except(items) from (
SELECT
event_name,
PARSE_DATE("%Y%m%d", event_date) as date,
TIMESTAMP_MICROS(event_timestamp) as timestamp,
(
SELECT split(params.value.string_value, ',')
FROM UNNEST(event_params) as params
WHERE key = 'event_param-key_to_filter'
) items,
FROM `firebase.analytics.table`
), unnest(items) item with offset
)
pivot (max(item) for offset in (0 as item0, 1 as item1, 2 as item2, 3 as item3, 4 as item4, 5 as item5))
此外,请查看以下答案,了解如何制作动态 PIVOT,以便在您事先不知道最大计数的情况下它适用于任意数量的项目
Dynamic Header in BigQuery
顺便说一句,下面是我上面提到的动态枢轴版本
execute immediate (select '''
select * from (
select * except(items) from (
SELECT
event_name,
PARSE_DATE("%Y%m%d", event_date) as date,
TIMESTAMP_MICROS(event_timestamp) as timestamp,
(
SELECT split(params.value.string_value, ',')
FROM UNNEST(event_params) as params
WHERE key = 'event_param-key_to_filter'
) items,
FROM `firebase.analytics.table`
), unnest(items) item with offset
)
pivot (max(item) for offset in (''' || string_agg(pos || ' as item' || pos, ', ') || ''')) '''
from
unnest(generate_array(0, (
select max(array_length(split(params.value.string_value, ','))) - 1
from `firebase.analytics.table`, unnest(event_params) as params
where key = 'event_param-key_to_filter'
))) pos
)
我正在尝试拆分作为事件参数的字符串 ("item1,item2,item3") (key = "to_split", value.string_value = "item1,item2,item3" ) 到 Google BigQuery 中的多个列。 目前,我有:
SELECT
event_name,
PARSE_DATE("%Y%m%d", event_date) as date,
TIMESTAMP_MICROS(event_timestamp) as timestamp,
(
SELECT split(params.value.string_value, ',')
FROM UNNEST(event_params) as params
WHERE key = 'event_param-key_to_filter'
),
FROM `firebase.analytics.table`
这将给出如下结果:
event_name | 日期 | 时间戳 | f0_ |
---|---|---|---|
示例事件 | 2021-06-15 | 2021-06-15 10:08:41.634055 UTC | Item\nItem\nItem\nItem |
(格式化不喜欢,但拆分将项目变成数组)
我正在努力获得这样的结果:
event_name | 日期 | 时间戳 | item0 | item1 | item2 | 项目... |
---|---|---|---|---|---|---|
示例事件 | 2021-06-15 | 2021-06-15 10:08:41.634055 UTC | 项目 | 项目 | 项目 | 等... |
对于 BigQuery,是否有一种好的方法可以将此项目数组沿 SQL 中的同一行拆分为多个列?我已经坚持了很长一段时间。
最佳
您可以使用数组引用:
SELECT t.*,
items[SAFE_ORDINAL(1)] as item_1,
items[SAFE_ORDINAL(2)] as item_2,
items[SAFE_ORDINAL(3)] as item_3,
items[SAFE_ORDINAL(4)] as item_4
FROM (SELECT event_name, PARSE_DATE("%Y%m%d", event_date) as date,
TIMESTAMP_MICROS(event_timestamp) as timestamp,
(SELECT split(params.value.string_value, ',')
FROM UNNEST(event_params) as params
WHERE key = 'event_param-key_to_filter'
) items
FROM `firebase.analytics.table` t
) t
考虑以下
select * from (
select * except(items) from (
SELECT
event_name,
PARSE_DATE("%Y%m%d", event_date) as date,
TIMESTAMP_MICROS(event_timestamp) as timestamp,
(
SELECT split(params.value.string_value, ',')
FROM UNNEST(event_params) as params
WHERE key = 'event_param-key_to_filter'
) items,
FROM `firebase.analytics.table`
), unnest(items) item with offset
)
pivot (max(item) for offset in (0 as item0, 1 as item1, 2 as item2, 3 as item3, 4 as item4, 5 as item5))
此外,请查看以下答案,了解如何制作动态 PIVOT,以便在您事先不知道最大计数的情况下它适用于任意数量的项目
Dynamic Header in BigQuery
顺便说一句,下面是我上面提到的动态枢轴版本
execute immediate (select '''
select * from (
select * except(items) from (
SELECT
event_name,
PARSE_DATE("%Y%m%d", event_date) as date,
TIMESTAMP_MICROS(event_timestamp) as timestamp,
(
SELECT split(params.value.string_value, ',')
FROM UNNEST(event_params) as params
WHERE key = 'event_param-key_to_filter'
) items,
FROM `firebase.analytics.table`
), unnest(items) item with offset
)
pivot (max(item) for offset in (''' || string_agg(pos || ' as item' || pos, ', ') || ''')) '''
from
unnest(generate_array(0, (
select max(array_length(split(params.value.string_value, ','))) - 1
from `firebase.analytics.table`, unnest(event_params) as params
where key = 'event_param-key_to_filter'
))) pos
)