BigQuery Arrays - Относительная навигация - PullRequest
1 голос
/ 23 апреля 2020

ОБНОВЛЕНИЕ : в то время как навигация работает, проблема теперь использует это - доступ к полям в сгенерированной анонимной структуре (не может получить доступ к полям по имени) - так навигация работала, но я что-то упустил, так что результат на самом деле доступен?

Я ответил на свой вопрос, когда заполнял это, но все равно хотел поделиться этим (с ключевым моментом, о котором я не знал), был СМЕЩЕНИЕ. Я искал, как добиться «навигационных» возможностей при обработке массивов (смотреть вперед / назад «n» - похоже на Lag / Lead). В этом примере я создаю структуру со следующими и предыдущими значениями:

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 дает ошибку синтаксического анализа, возможно ли это? или это могут быть только _field_1 анонимные?

то есть AS X, AS Next, AS Previous

ARRAY(SELECT (item AS X, list[SAFE_OFFSET(pos+1)] AS Next, list[SAFE_OFFSET(pos-1)] AS Previous) FROM UNNEST(list)

'Ожидается ")" или "," но есть ключевое слово AS' - возможно ли это?

Одним интересным поворотом этого может быть несколько вычислений по сравнению с предыдущим, что если бы я хотел знать не только предыдущее, но и предыдущее значение 'MIN' относительно этой строки для всех предыдущих?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Итак, мой последний вопрос: как я могу создать псевдоним для имен полей структур, проверка BQ дает ошибку синтаксического анализа, возможно ли это? или это могут быть только _field_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   

Или вы можете использовать AS 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
1 голос
/ 23 апреля 2020

Вы должны использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...