Хотя верно, что «BigQuery не поддерживает самостоятельное определение агрегированной функции» (надеюсь, что пока) - всегда есть обходной путь - см. Ниже (для стандартного SQL BigQuery)
#standardSQL
CREATE TEMP FUNCTION my_func(arr ARRAY<STRUCT<date_col DATE, val_col INT64>>, days INT64) AS ((
SELECT CAST(SUM(IF(date_col > DATE_SUB(CURRENT_DATE(), INTERVAL days DAY), val_col, 0)) AS INT64)
FROM UNNEST(arr)
));
SELECT
city,
my_func(ARRAY_AGG((date, value)), 7) value_7,
my_func(ARRAY_AGG((date, value)), 14) value_14
FROM `project.dataset.table`
GROUP BY city
, так что есливам нужно повторить ту же логику, скажем, для другого столбца - value2 - вы просто добавляете ниже к вышеуказанному запросу (и так далее ...)
my_func(ARRAY_AGG((date, value2)), 7) value2_7,
my_func(ARRAY_AGG((date, value2)), 14) value2_14