Вот функция, которая использует 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
);