代码之家  ›  专栏  ›  技术社区  ›  phaigeim

对bigquery中的所有列应用函数

  •  0
  • phaigeim  · 技术社区  · 5 年前

    我有一个超过100列的表c1,c2,c3….c200,我想在所有列上应用函数(假设max)。我可以为每一列编写查询,但是我不能使用BigQueq来抛出这个错误 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
    

    我能以较短的形式写查询吗?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Mikhail Berlyant    5 年前

    下面的示例适用于bigquery标准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  
    
        2
  •  1
  •   damir huselja    5 年前

    将数据集作为函数的参数传递时,函数是否接受数据集作为其输入参数?如果不是,你当然会犯错误。 你可以这样尝试:

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