Google BigQuery проверяет, является ли один массив надмножеством / подмножеством другого - PullRequest
0 голосов
/ 25 февраля 2020

Учитывая два массива в Google BigQuery, мне нужно выяснить, содержатся ли ВСЕ элементы в одном массиве в другом.

В качестве примера я пытаюсь выполнить следующий запрос:

WITH
  ArrayA AS (
  SELECT
    [1, 2, 3] arrA,
  UNION ALL
  SELECT
    [4, 5, 6])
  ArrayB AS (
  SELECT
    [1, 2, 3, 4, 5] arrB)
SELECT
  *
FROM
  ArrayA
CROSS JOIN
  ArrayB
WHERE
  <your code goes here>

так, что результат выглядит как

arrA    | arrB
[1,2,3] | [1,2,3,4,5]

, поскольку [1,2,3,4,5] является надмножеством [1,2,3], но не надмножеством [ 4,5,6].

Большое спасибо заранее.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Вы можете проверить каждый элемент в arrA, а затем получить его минимум. Если все элементы arrA в arrB, будет 3 true s, поэтому минимум будет истинным. Если хотя бы один из них не находится в arrB, будет 2 true и 1 false, поэтому минимум будет ложным.

WITH
ArrayA AS (
    SELECT [1, 2, 3] arrA,
    UNION ALL
    SELECT [4, 5, 6]
),
ArrayB AS (
  SELECT [1, 2, 3, 4, 5] arrB
)
SELECT
  *, 
  (
    SELECT min(a in UNNEST(arrB))
    FROM UNNEST(arrA) as a
  ) as is_a_in_b
FROM ArrayA
CROSS JOIN ArrayB

Вы также можете сделать его функцией и использовать ее во многих местах. Извините за плохое наименование:)

CREATE TEMP FUNCTION is_array_in_array(subset ARRAY<int64>, main ARRAY<int64>) AS ((SELECT min(a in UNNEST(main)) FROM UNNEST(subset) as a));

WITH
ArrayA AS (
    SELECT [1, 2, 3] arrA,
    UNION ALL
    SELECT [4, 5, 6]
),
ArrayB AS (
  SELECT [1, 2, 3, 4, 5] arrB
)
SELECT
  *, 
  is_array_in_array(arrA, arrB) as is_a_in_b
FROM ArrayA
CROSS JOIN ArrayB
0 голосов
/ 25 февраля 2020

Я думаю, что эти условия делают то, что вы хотите:

WITH
  ArrayA AS (
  SELECT ARRAY[1, 2, 3] arrA,
  UNION ALL
  SELECT ARRAY[4, 5, 6]),
  ArrayB AS (
  SELECT ARRAY[1, 2, 3, 4, 5] arrB)
SELECT *
FROM ArrayA a CROSS JOIN
     ArrayB b
WHERE NOT EXISTS (SELECT a_el
                  FROM UNNEST(a.arrA) a_el LEFT JOIN
                       UNNEST(b.arrB) b_el
                       ON a_el = b_el
                  WHERE b_el IS NULL
                 ) AND
      NOT EXISTS (SELECT COUNT(*)
                  FROM UNNEST(a.arrA) a_el LEFT JOIN
                       UNNEST(b.arrB) b_el
                       ON a_el = b_el
                  HAVING COUNT(*) <> COUNT(b_el)
                 ) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...