Применение функции ко всем столбцам в BigQuery - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть таблица с более чем 100 столбцами c1, c2, c3 .... c200, и я хочу применить функцию (предположим, MAX) ко всем столбцам.Я могу составить свой запрос для каждого столбца, но я не могу использовать *, для которого BigQuery выдает эту ошибку Argument * can only be used in COUNT(*)

Этот формат запроса работает, но размер моего запроса будет намного больше и пропорционален количеству столбцов.

SELECT max(c1) as c1, max(c2) as c2 .... max(c200) as c200 FROM `MYTABLE` group by user

Можно ли написать запрос в более короткой форме?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

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

#standardSQL
SELECT STRING_AGG(CAST(max_val AS STRING) ORDER BY pos) max_values
FROM (
  SELECT pos, MAX(CAST(val AS INT64)) max_val
  FROM `project.dataset.table` t,
  UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'".+?":([^,}]+)')) val WITH OFFSET pos
  GROUP BY pos
)

ВВ вышеприведенном примере я предполагаю, что все столбцы имеют тип данных INT64

. Вы можете протестировать, поиграть с ними, используя фиктивные данные, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 c1, 2 c2, 3 c3 UNION ALL
  SELECT 11, 1, 22
)
SELECT STRING_AGG(CAST(max_val AS STRING) ORDER BY pos) max_values
FROM (
  SELECT pos, MAX(CAST(val AS INT64)) max_val
  FROM `project.dataset.table` t,
  UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'".+?":([^,}]+)')) val WITH OFFSET pos
  GROUP BY pos
)

с результатом

Row max_values   
1   11,2,22  
0 голосов
/ 18 февраля 2019

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

select
(select max(c1) from mytable) max_c1,
(select max(c2) from mytable) max_c2

from dual
...