Как добавить массивы в BigQuery SQL? - PullRequest
0 голосов
/ 06 мая 2019

У меня есть UDF, который возвращает массив с плавающей запятой одинакового размера для каждой строки таблицы.Как суммировать значения этих массивов?

Другими словами, как я могу сделать что-то вроде этого:

create temp function f(...)
returns array<float64>
...;
select sum(f(column)) from table

Как результат этой операции мне нуженполучить другой массив равного размера, где

result[i] = sum(over rows) f(row, column)[i]

Ответы [ 3 ]

1 голос
/ 06 мая 2019

Итак, исходя из вашего комментария, вы ищете sum значения всех ваших массивов.Вот как вы можете сделать это, используя оператор UNNEST

WITH mydata  AS (
  SELECT [1.4, 1.3, 1.4, 1.1] as myarray
  union all 
  SELECT [1.4, 1.3, 1.4, 1.1] as myarray
  union all 
  SELECT [1.4, 1.3, 1.4, 1.1] as myarray
)

SELECT SUM(eachelement) from mydata, UNNEST(myarray) AS eachelement; 
0 голосов
/ 06 мая 2019

Если вы определили свой UDF (берете ваши столбцы и возвращаете массив float64 с заранее определенными (или фиксированными) размерами), вы можете использовать упрощенное решение. Например, в случае трехмерных массивов, что-то вроде:

create temp function f(...)
returns array<float64>
...;

with dataset as (
  select arr[offset(0)] as col_a, arr[offset(1)] as col_b, arr[offset(2)] as col_c
    from (
       select f(mycolumn) as arr
       from `mydataset.mytable`
    )
)

select [sum(col_a), sum(col_b), sum(col_c)] as new_array from dataset
0 голосов
/ 06 мая 2019

Вот функция, которая использует ANY TYPE для поддержки суммирования массивов FLOAT64, INT64 или NUMERIC вместе с некоторыми примерами ввода:

CREATE TEMP FUNCTION ElementWiseSum(arr1 ANY TYPE, arr2 ANY TYPE) AS (
  ARRAY(SELECT x + arr2[OFFSET(off)] FROM UNNEST(arr1) AS x WITH OFFSET off ORDER BY off)
);

SELECT arr1, arr2, ElementWiseSum(arr1, arr2) AS result
FROM (
  SELECT [1, 2, 3] AS arr1, [4, 5, 6] AS arr2 UNION ALL
  SELECT [7, 8], [9, 10] UNION ALL
  SELECT [], [] UNION ALL
  SELECT [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]
);

Он отменяет arr1, используя WITH OFFSET, затем извлекает эквивалентный элемент из arr2, используя это смещение, и упорядочивает по смещению, чтобы обеспечить сохранение порядка элементов.

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

SELECT
  ARRAY_AGG(sum ORDER BY off) AS arr
FROM (
  SELECT
    off,
    SUM(x) AS sum
  FROM (
    SELECT [1, 2, 3] AS arr UNION ALL
    SELECT [7, 8, 9] UNION ALL
    SELECT [4, 5, 6] UNION ALL
    SELECT [10, 11, 12]
  ), UNNEST(arr) AS x WITH OFFSET off
  GROUP BY off
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...