Ниже мысли / предложения, относящиеся к стандарту 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