Bigquery - 数组索引 5 超出范围
Bigquery - array index 5 is out of bounds
我的查询有两个问题。查询的想法是将水平 eventInfo 数据列化,然后将其连接到另一个 table 具有特定名称的数据。
以下代码仅适用于一个 sessionId。如果没有 where 子句,我会收到此错误:错误:数组索引 5 超出范围(溢出)。
解决了。我混淆了列名。 序号的参数与我取最大值的参数不同。
第二个问题是,虽然我取了几乎所有数组的最后一行,但有一个名称数组我想取消嵌套在最终结果之上。
示例输出 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 是结构的名称。
我的查询有两个问题。查询的想法是将水平 eventInfo 数据列化,然后将其连接到另一个 table 具有特定名称的数据。
以下代码仅适用于一个 sessionId。如果没有 where 子句,我会收到此错误:错误:数组索引 5 超出范围(溢出)。 解决了。我混淆了列名。 序号的参数与我取最大值的参数不同。
第二个问题是,虽然我取了几乎所有数组的最后一行,但有一个名称数组我想取消嵌套在最终结果之上。 示例输出 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 是结构的名称。