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
)