Google bigquery BigQuery数组-相对位置导航

Google bigquery BigQuery数组-相对位置导航,google-bigquery,Google Bigquery,更新:导航工作时,issue现在正在使用它-访问生成的匿名结构中的字段(不能按名称访问字段)-因此导航工作正常,但我遗漏了一些内容,因此结果实际上是可访问的 我在填写时回答了自己的问题,但我觉得无论如何都要与大家分享这个问题(我不知道的关键是抵消)。我正在研究如何在处理阵列时实现“导航”功能(向前看/向后看“n”-类似于滞后/超前)。在本例中,我使用下一个和上一个值创建了一个结构: WITH items AS (SELECT ["apples", "bananas", "pears", "g

更新:导航工作时,issue现在正在使用它-访问生成的匿名结构中的字段(不能按名称访问字段)-因此导航工作正常,但我遗漏了一些内容,因此结果实际上是可访问的

我在填写时回答了自己的问题,但我觉得无论如何都要与大家分享这个问题(我不知道的关键是抵消)。我正在研究如何在处理阵列时实现“导航”功能(向前看/向后看“n”-类似于滞后/超前)。在本例中,我使用下一个和上一个值创建了一个结构:

WITH items AS
  (SELECT ["apples", "bananas", "pears", "grapes"] as list)

SELECT
  list AS original_list, 
  ARRAY(SELECT (item, list[SAFE_OFFSET(pos+1)], list[SAFE_OFFSET(pos-1)]) FROM UNNEST(list) item WITH OFFSET pos) new_list
FROM
  items
生产

[("apples","bananas",NULL), ("bananas","pears","apples"), ("pears", "grapes", "bananas"), ("grapes", NULL, "pears")]
工作得很好-所以我的最后一个问题是如何为结构字段的名称命名,BQ验证给出了一个解析错误,可能吗?或者它只能是“字段1”匿名的吗

i、 e作为X,作为下一个,作为上一个

ARRAY(SELECT (item AS X, list[SAFE_OFFSET(pos+1)] AS Next, list[SAFE_OFFSET(pos-1)] AS Previous) FROM UNNEST(list)
'Expected')”或“,”但得到关键字AS'-这可能吗

一个有趣的转折点可能是对上一行的一些计算,如果我想知道的不仅仅是上一行,而是所有上一行相对于此行的上一个“MIN”值,该怎么办


谢谢

应该使用struct为它们命名

WITH items AS
  (SELECT ["apples", "bananas", "pears", "grapes"] as list)

SELECT
  list AS original_list, 
  (
    SELECT ARRAY_AGG(STRUCT(item, next, prev))
    FROM (
      SELECT l AS item, LAG(l) OVER (order by o) as prev, LEAD(l) OVER (order by o) as next
      FROM UNNEST(list) l WITH OFFSET o
      ORDER BY o
    )
  ) as new_list
FROM
  items
要访问它们,您需要取消对它们的检测。例如:

WITH 
items AS
(
    SELECT 1 as id, ["apples", "bananas", "pears", "grapes"] as list union all
    SELECT 2 as id, ["strawberries", "oranges", "kiwis", "figs"] as list
),
grouped AS
(
  SELECT
    id,
    list AS original_list, 
    (
      SELECT ARRAY_AGG(STRUCT(item, next, prev))
      FROM (
        SELECT l AS item, LAG(l) OVER (order by o) as prev, LEAD(l) OVER (order by o) as next
        FROM UNNEST(list) l WITH OFFSET o
        ORDER BY o
      )
    ) as new_list
  FROM
    items
)
SELECT id, list_item.item, list_item.next, list_item.prev
FROM grouped
JOIN UNNEST(new_list) as list_item

您应该使用struct为它们命名

WITH items AS
  (SELECT ["apples", "bananas", "pears", "grapes"] as list)

SELECT
  list AS original_list, 
  (
    SELECT ARRAY_AGG(STRUCT(item, next, prev))
    FROM (
      SELECT l AS item, LAG(l) OVER (order by o) as prev, LEAD(l) OVER (order by o) as next
      FROM UNNEST(list) l WITH OFFSET o
      ORDER BY o
    )
  ) as new_list
FROM
  items
要访问它们,您需要取消对它们的检测。例如:

WITH 
items AS
(
    SELECT 1 as id, ["apples", "bananas", "pears", "grapes"] as list union all
    SELECT 2 as id, ["strawberries", "oranges", "kiwis", "figs"] as list
),
grouped AS
(
  SELECT
    id,
    list AS original_list, 
    (
      SELECT ARRAY_AGG(STRUCT(item, next, prev))
      FROM (
        SELECT l AS item, LAG(l) OVER (order by o) as prev, LEAD(l) OVER (order by o) as next
        FROM UNNEST(list) l WITH OFFSET o
        ORDER BY o
      )
    ) as new_list
  FROM
    items
)
SELECT id, list_item.item, list_item.next, list_item.prev
FROM grouped
JOIN UNNEST(new_list) as list_item
所以我的最后一个问题是,我如何给结构域的名称加上别名,BQ验证给出了一个解析错误,可能吗?或者它只能是“字段1”匿名的吗

您的原始查询非常接近-您刚刚错过了使用关键字
STRUCT

#standardSQL
SELECT
  list AS original_list, 
  ARRAY(
    SELECT STRUCT(item AS X, list[SAFE_OFFSET(pos+1)] AS Next, list[SAFE_OFFSET(pos-1)] AS Previous) 
    FROM UNNEST(list) item WITH OFFSET pos) new_list
FROM
  items   
或者,您可以使用
作为STRUCT
,如下例所示

#standardSQL
SELECT
  list AS original_list, 
  ARRAY(
    SELECT AS STRUCT item AS X, list[SAFE_OFFSET(pos+1)] AS Next, list[SAFE_OFFSET(pos-1)] AS Previous
    FROM UNNEST(list) item WITH OFFSET pos
  ) new_list
FROM
  items
所以我的最后一个问题是,我如何给结构域的名称加上别名,BQ验证给出了一个解析错误,可能吗?或者它只能是“字段1”匿名的吗

您的原始查询非常接近-您刚刚错过了使用关键字
STRUCT

#standardSQL
SELECT
  list AS original_list, 
  ARRAY(
    SELECT STRUCT(item AS X, list[SAFE_OFFSET(pos+1)] AS Next, list[SAFE_OFFSET(pos-1)] AS Previous) 
    FROM UNNEST(list) item WITH OFFSET pos) new_list
FROM
  items   
或者,您可以使用
作为STRUCT
,如下例所示

#standardSQL
SELECT
  list AS original_list, 
  ARRAY(
    SELECT AS STRUCT item AS X, list[SAFE_OFFSET(pos+1)] AS Next, list[SAFE_OFFSET(pos-1)] AS Previous
    FROM UNNEST(list) item WITH OFFSET pos
  ) new_list
FROM
  items

您好,谢谢-我将确定完成后,我的问题是我无法评估字段,因为它们现在在结构中是匿名的,因此您无法通过名称访问它们?因此,如果没有帮助,它目前不可用。它仍然是一个数组。要访问数组的项,应取消对其的测试。嵌套后,该项将成为结构(命名零件)。假设您使用了UNNEST(新列表)作为新列表项。然后应该使用new_list_item.next、new_list_item.prev来访问它们。另一个例子是在我的回答中,谢谢-我会确定完成后,我的问题是我不能评估字段,因为它们现在在结构中是匿名的,因此你不能通过名称访问它们?因此,如果没有帮助,它目前不可用。它仍然是一个数组。要访问数组的项,应取消对其的测试。嵌套后,该项将成为结构(命名零件)。假设您使用了UNNEST(新列表)作为新列表项。然后应该使用new_list_item.next、new_list_item.prev来访问它们。另一个例子是在我的回答中。谢谢有意义。谢谢有意义。谢谢米哈伊尔!一个字,我确实认为它应该起作用-干杯。谢谢米哈伊尔!一个字,我确实认为它应该起作用-干杯。