Bigquery - 数组索引 5 超出范围

Bigquery - array index 5 is out of bounds

我的查询有两个问题。查询的想法是将水平 eventInfo 数据列化,然后将其连接到另一个 table 具有特定名称的数据。

  1. 以下代码仅适用于一个 sessionId。如果没有 where 子句,我会收到此错误:错误:数组索引 5 超出范围(溢出)。 解决了。我混淆了列名。 序号的参数与我取最大值的参数不同。

  2. 第二个问题是,虽然我取了几乎所有数组的最后一行,但有一个名称数组我想取消嵌套在最终结果之上。 示例输出 returns 每个 sessionId 一行,但如果名称数组有多个值,最终结果应该是每个人一行,每个 sessionId/date/checkin 组合。 我不确定为什么我对名称数组的嵌套不起作用...... 现在我得到一个 字段名 val 在 STRUCT 中不存在。这是在 names.val 行。

这是一个基线查询:

with eventData as ( 
 select
 concat(fullVisitorId, ' ', cast(VisitId as string)) sessionId, date as date, 
 hit.hour as checkinHour, hit.minute as checkinMin,
 (select array_agg(hit.eventInfo.eventAction) from UNNEST(hits) hit where hit.eventInfo.eventCategory = 'foo') as foo_value,
 (select array_agg(struct(hit.eventInfo.eventAction)) as val from UNNEST(hits) hit where hit.eventInfo.eventCategory = 'submit_checkin') as names
 FROM  `web-analytics.192016109.ga_sessions_20191223`,
 UNNEST(hits) as hit
 )
 select 
 sessionId, date, 
 max(checkinHour) chkHr, max(checkinMin) as chkMin, # end of transaction
 max(foo_value[ordinal(ARRAY_LENGTH(foo_value))]) as foo_value, 
 names.val
 from eventData,
 unnest (names) as names
 group by sessionId, date

任何帮助将不胜感激,因为我不是这种语法的专家。 节日快乐!

对于第一项,您可能正在处理本应为数组的空值。索引越界错误是由 ordinal function

引起的

对于第二项,您应该尝试使用左连接而不是“,”,例如:

 from eventData left join
 unnest (names) as names
 group by sessionId, date

取而代之:

from eventData,
 unnest (names) as names
 group by sessionId, date

当你有 null 个数组时,你可能会丢失一些执行 unnest 的数据,所以你可以使用 left join 来避免这种情况。

只有一个问题:names 列是否用于任何用途?在您的查询中,此专栏似乎没有存在的理由。

编辑 1:

尝试使用 names.eventAction 而不是 names.val。另外,LEFT JOIN 似乎是最好的选择。

with eventData as (   select  concat(fullVisitorId, ' ', cast(VisitId as string)) sessionId, date as date,   hit.hour as checkinHour, hit.minute as checkinMin,  (select array_agg(hit.eventInfo.eventAction) from UNNEST(hits) hit where hit.eventInfo.eventCategory = 'foo') as foo_value,  (select array_agg(struct(hit.eventInfo.eventAction)) as val from UNNEST(hits) hit where hit.eventInfo.eventCategory = 'submit_checkin') as names  FROM  `data-to-insights.ecommerce.web_analytics`,  UNNEST(hits) as hit )  select 
     sessionId, 
     date, 
     max(checkinHour) chkHr, max(checkinMin) as chkMin, # end of transaction
     max(foo_value[ordinal(ARRAY_LENGTH(foo_value))]) as foo_value, 
     names.eventAction name_val    from eventData left join  unnest (names) as names  group by sessionId, date, name_val

我找到了答案。我需要使用 names.eventAction 而不是 names.val。这是因为当我取消嵌套名称时,val 结构被展平了。所以技术上不存在了。 我还假设 val 是字段的名称,但 val 是结构的名称。