Объединение и выбор для массивов в BigQuery - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть два способа работы с массивами в таблицах, когда я запрашиваю Bigquery.Первый - использовать запятую и UNNEST, а другой - использовать встроенный SELECT.В каждом случае я собираюсь извлечь одну запись из массива на основе некоторых критериев.Я адаптировал пример работы с массивами BigQuery, чтобы показать, что я имею в виду ниже и по этой ссылке: GBQ

#standardSQL
WITH races AS (
  SELECT "800M" AS race,
    [STRUCT("Rudisha" as name),
     STRUCT("Rotich" as name),
     STRUCT("Berian" as name)]
       AS participants
UNION ALL
  SELECT "400M" AS race,
    [STRUCT("Rudisha" as name),
     STRUCT("Rotich" as name),
     STRUCT("Berian" as name)]
)



SELECT
  race,
  (SELECT name from UNNEST(r.participants) where name = "Rudisha" LIMIT 1) as participant
FROM races r;


SELECT  race, participant.name
FROM races r, UNNEST(r.participants) as participant
WHERE participant.name = "Rudisha";

Два оператора выбора производят один и тот же вывод в этом примере и способамиЯ использовал их в живом коде.Одно ограничение заключается в том, что я всегда извлекаю только один элемент из массива, даже если в массиве несколько элементов, основываясь на каком-то условии.Мои вопросы:

  1. Есть ли предпочтение производительности для одного метода для больших таблиц с относительно короткими массивами, часто с одним элементом в массиве?
  2. Есть ли разница в том, какзапросы структурированы, что может привести к различным результатам с более сложными или интересными данными?

1 Ответ

0 голосов
/ 15 сентября 2018
WITH data AS (
  SELECT 1 a, [1,2,3] arr1, ['a','b','c'] arr2
)

Каков результат добавления всех чисел из arr1?

SELECT SUM(a1) sum 
FROM data, UNNEST(arr1) a1

Ответ 6. Но что если мы сделаем это:

SELECT SUM(a1) sum, MAX(a2)
FROM data, UNNEST(arr1) a1, UNNEST(arr2)

18   c

Ответ сейчас 18 - но это не правильно! Что ж, это правильный ответ после того, как мы выполним CROSS JOIN с arr2 - но результаты нас удивят.

Так, как правильно получить MAX от arr2 и SUM от arr1?

SELECT (SELECT SUM(a1) FROM UNNEST(arr1) a1)
  , (SELECT MAX(a2) FROM UNNEST(arr2) a2)
FROM data

6   c

Урок здесь: Избегайте «взрывающихся соединений» от выполнения CROSS JOIN между вложенными массивами - сохраняйте их как массивы, пока они вам не понадобятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...