【问题标题】:Array index 1 is out of bounds (overflow) when widening date range扩大日期范围时,数组索引 1 超出范围(溢出)
【发布时间】:2018-10-30 09:42:18
【问题描述】:

我正在运行以下查询以返回每个用户购买最多的类别,这在 30 天和 60 天的日期范围内工作正常,但是当我尝试在过去 100 天内运行它时,我得到了错误:

Array index 1 is out of bounds (overflow)

为什么扩大日期范围会导致此错误?

WITH `query_result` AS (

SELECT customDimension.value AS UserID,
SUM(CASE WHEN LOWER(hits_product.v2ProductName) LIKE "% mens%" THEN 1 ELSE 0 END) AS mens,
SUM(CASE WHEN LOWER(hits_product.v2ProductName) LIKE "%womens%" THEN 1 ELSE 0 END) AS womens,
SUM(CASE WHEN LOWER(hits_product.v2ProductName) LIKE "%boys%" 
OR LOWER(hits_product.v2ProductName) LIKE "%girls%"
THEN 1 ELSE 0 END) AS kids
FROM `xxx.xxx.ga_sessions_20*` AS t
  CROSS JOIN UNNEST(hits) AS hits
  CROSS JOIN UNNEST(t.customdimensions) AS customDimension
  CROSS JOIN UNNEST(hits.product) AS hits_product
WHERE parse_date('%y%m%d', _table_suffix) between 
DATE_sub(current_date(), interval 100 day) and
DATE_sub(current_date(), interval 1 day)
AND customDimension.index = 2
AND hits.eCommerceAction.action_type = "6"
GROUP BY UserID
HAVING
SUM(CASE WHEN LOWER(hits_product.v2ProductName) LIKE "%boys%" 
OR LOWER(hits_product.v2ProductName) LIKE "%girls%"
THEN 1 ELSE 0 END) > 0
)
  SELECT *, 
  ARRAY_TO_STRING(ARRAY(
    SELECT SPLIT(kv, ':')[OFFSET(0)]
    FROM UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), r'[{"}]', ''))) kv
    WHERE LOWER(SPLIT(kv, ':')[OFFSET(0)]) <> LOWER('UserID')
    ORDER BY CAST(SPLIT(kv, ':')[OFFSET(1)] AS INT64) DESC
    LIMIT 1
  ), ',') top_purchased_gender
FROM `query_result` t

【问题讨论】:

  • 也许您的kv 值之一不符合您期望的格式?你可以试试 SAFE_OFFSET。

标签: sql google-bigquery


【解决方案1】:

只需使用[safe_offset (1)] 而不是[offset (1)] 然后处理空异常

像这样:

ORDER BY CAST(ifnull(SPLIT(kv, ':')[safe_offset (1)], 0) AS INT64) DESC

https://cloud.google.com/bigquery/docs/reference/standard-sql/operators#array_subscript_operator

https://cloud.google.com/bigquery/docs/reference/standard-sql/conditional_expressions#ifnull

【讨论】:

    【解决方案2】:

    至少有一个行有一个空值的字段,数组应该是一个空值或空值而不是空数组。 它不是在过去 30 天或过去 60 天内,而是在过去 100 天内,您确实至少发生过一次。那就是让你的 sql 跳跃。 您需要相应地设置默认值(使用空数组或保证数组具有您将要搜索的最少字段数的函数)并且不允许该字段为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多