Bigquery - Как абстрагировать повторную логику - PullRequest
1 голос
/ 06 ноября 2019

Я нахожусь в ситуации, когда я повторяю одну и ту же логику снова и снова, как это

SELECT
  city,
  CAST(SUM(IF(date > DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY), value, 0)) AS INT64) AS value_7,
  CAST(SUM(IF(date > DATE_SUB(CURRENT_DATE(), INTERVAL 14 DAY), value, 0)) AS INT64) AS value_14
FROM
  table
GROUP BY
  city

, теперь рядом с value У меня есть 10 других столбцов, к которым я хочу применить ту же логику,Есть ли простой способ абстрагироваться от форматирования и обработки?

как my_func(val_col, date_col, days)?

Я знаю, я могу сделать это вручную, но это выглядит так некрасиво.

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Хотя верно, что «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
0 голосов
/ 06 ноября 2019

Вы можете создать временных функций и вызывать их в SQL-запросе, в значительной степени my_func(col, days), который вы упомянули.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...