Конкатенация массивов в bigquery с пустыми массивами - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть таблица, которая выглядит следующим образом:

enter image description here

Затем я пытаюсь объединить label1, label2, label3 в один массив для каждого типаметки, а затем, наконец, я хочу поместить все ненулевые метки в один объединенный массив.Таким образом, мой запрос выглядит так:

#standardSQL
WITH
table AS (
SELECT 'abc' id, 1 label1, 12 label2, 122 label3 UNION ALL
SELECT 'abc', 1, 12, 129 UNION ALL
SELECT 'xyz', 2, 23, NULL UNION ALL
SELECT 'xyz', 2, 24, NULL
),

each_label_agg AS (
 SELECT
 id,
 ARRAY_AGG(label1 IGNORE NULLS) AS label1_agg,
 ARRAY_AGG(label2 IGNORE NULLS) AS label2_agg,
 ARRAY_AGG(label3 IGNORE NULLS) AS label3_agg
FROM
table
GROUP BY
 id)
SELECT
 each_label_agg.*,
 ARRAY_CONCAT(each_label_agg.label1_agg, each_label_agg.label2_agg, 
 each_label_agg.label3_agg) AS combined_labels
FROM
 each_label_agg

И вывод выглядит так:

enter image description here

Но в выводе я ожидалcombined_labels будет [2,2,23,24] для идентификатора xyz.

Параметр ignore nulls не работает в array_concat.Я предполагаю, что как-то combined_labels искажается из-за пустого массива в label3.Как я могу получить ожидаемое combined_labels для xyz равным [2,2,23,24]?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Причина этой проблемы заключается в том, что BigQuery имеет ограничения в отношении NULL значений и генерация массива вернет NULL, если какой-либо аргумент NULL, как задокументировано здесь ,Поэтому их удобно заменить пустыми массивами (поскольку NULL s и пустые массивы - это два разных значения в BigQuery)

0 голосов
/ 11 декабря 2018
#standardSQL
WITH table AS (
  SELECT 'abc' id, 1 label1, 12 label2, 122 label3 UNION ALL
  SELECT 'abc', 1, 12, 129 UNION ALL
  SELECT 'xyz', 2, 23, NULL UNION ALL
  SELECT 'xyz', 2, 24, NULL
), each_label_agg AS (
 SELECT
   id,
   ARRAY_AGG(label1 IGNORE NULLS) AS label1_agg,
   ARRAY_AGG(label2 IGNORE NULLS) AS label2_agg,
   ARRAY_AGG(label3 IGNORE NULLS) AS label3_agg
  FROM table
  GROUP BY id
)
SELECT
  each_label_agg.*,
  ARRAY_CONCAT(
   IFNULL(each_label_agg.label1_agg, []), 
   IFNULL(each_label_agg.label2_agg, []),
   IFNULL(each_label_agg.label3_agg, [])
  ) AS combined_labels
FROM each_label_agg
...