在BigQuery的所有列上应用函数

时间:2019-02-18 13:17:31

标签: sql function optimization google-bigquery multiple-columns

我有一个包含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 :(得分:1)

您正在将数据集作为函数的参数传递,您的函数是否接受数据集作为其输入参数?如果没有,您当然会得到错误。 您可以尝试这样:

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

from dual

答案 1 :(得分:1)

下面的示例适用于BigQuery Standard SQL,避免使用名称来调用所有列,但副作用是,按逗号分隔的最大值列表仅是各个列的顺序

#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