BigQuery - заполнение полей SELECT из результатов временной функции - PullRequest
1 голос
/ 03 июля 2019

В Google BigQuery у меня есть запрос с одинаковым именем поля, появляющийся несколько раз в различных подзапросах соединения. Я хотел бы абстрагировать это имя поля во временную функцию, чтобы оно менялось во всех местах, если я изменю его только внутри функции.

Это мой запрос:

SELECT *
FROM

(SELECT field1, COUNT(*) sq1_total
FROM table
WHERE condition = 1
GROUP BY field 1) sq1

LEFT JOIN

(SELECT field1, COUNT(*) sq2_total
FROM table
WHERE condition = 0
GROUP BY field 1) sq2

USING(field1)

Вот что я хотел бы иметь:

CREATE TEMP FUNCTION replace_field_name() AS (...);

SELECT *
FROM

(SELECT replace_field_name(), COUNT(*) sq1_total
FROM table
WHERE condition = 1
GROUP BY replace_field_name()) sq1

LEFT JOIN

(SELECT replace_field_name(), COUNT(*) sq2_total
FROM table
WHERE condition = 0
GROUP BY replace_field_name()) sq2

USING(replace_field_name())

Так что, когда я хочу сравнить много разных полей, как это, мне нужно только изменить имя поля в одном месте, а не в пяти местах.

Возможно ли это?

1 Ответ

2 голосов
/ 04 июля 2019

Ниже мысли / предложения, относящиеся к стандарту BigQuery SQL

Я хотел бы абстрагировать это имя поля во временную функцию ...

Как отметил Тим в своем комментарии - это совершенно невозможно сделать так, как вы это высмеиваете

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

Вы можете попытаться переписать свой запрос таким образом, что вам потребуется изменить имя поля в меньшем количестве мест, как в приведенных ниже примерах

#standardSQL
SELECT * FROM (SELECT field1, COUNT(*) sq1_total FROM `project.dataset.table` WHERE condition = 1 GROUP BY 1) sq1
    LEFT JOIN (SELECT field1, COUNT(*) sq2_total FROM `project.dataset.table` WHERE condition = 0 GROUP BY 1) sq2
USING (field1)

ИЛИ

#standardSQL
SELECT DISTINCT field1, 
  COUNTIF(condition = 1) OVER(PARTITION BY field1) sq1_total, 
  COUNTIF(condition = 0) OVER(PARTITION BY field1) sq2_total
FROM `project.dataset.table`

В вышеупомянутых запросах - "всего лишь" три места для замены имени поля (в отличие от 5 в исходном запросе)

Очевидно, - это не решает проблему качественно - только количественно

Возможно ли это?

Хорошие новости - всегда есть обходной путь - но обычно требуется немного изменить что-то в ваших требованиях, ожиданиях

Например, в приведенном ниже решении вам нужно установить имя поля только один раз в UNNEST(['field1']) field строке

#standardSQL
SELECT DISTINCT field, value,
  COUNTIF(condition = 1) OVER(PARTITION BY field, value) sq1_total, 
  COUNTIF(condition = 0) OVER(PARTITION BY field, value) sq2_total
FROM (
  SELECT field, REGEXP_EXTRACT(x, CONCAT(r'"', field, '":"?([^",])"?')) value, condition
  FROM `project.dataset.table` t,
  UNNEST([TO_JSON_STRING(t)]) x,
  UNNEST(['field1']) field
)

«цена» - у вас будет вывод в виде (с фиктивными данными)

Row field   value   sq1_total   sq2_total    
1   field1  1       1           3    
2   field1  2       1           0    

вместо вывода из исходного запроса

Row field1  sq1_total   sq2_total    
1   1       1           3    
2   2       1           null     

Я хочу сравнить много разных полей, как это ...

Дополнительное значение в вышеприведенном подходе заключается в том, что вы можете запустить сравнение (для любого количества полей) сколько угодно - добавив имена необходимых полей в список UNNEST(['field1']) field, как в примере ниже

#standardSQL
SELECT DISTINCT field, value,
  COUNTIF(condition = 1) OVER(PARTITION BY field, value) sq1_total, 
  COUNTIF(condition = 0) OVER(PARTITION BY field, value) sq2_total
FROM (
  SELECT  field, REGEXP_EXTRACT(x, CONCAT(r'"', field, '":"?([^",])"?')) value, condition
  FROM `project.dataset.table` t,
  UNNEST([TO_JSON_STRING(t)]) x,
  UNNEST(['field1', 'field2']) field
)
-- ORDER BY field, value

чтобы результат мог выглядеть как

Row field   value   sq1_total   sq2_total    
1   field1  1       1           3    
2   field1  2       1           0    
3   field2  1       1           1    
4   field2  2       0           2    
5   field2  3       1           0    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...