在 BigQuery 中按 Max(values) 返回列的名称。错误:“运算符 CASE 没有匹配的签名;”大查询

Posted

技术标签:

【中文标题】在 BigQuery 中按 Max(values) 返回列的名称。错误:“运算符 CASE 没有匹配的签名;”大查询【英文标题】:Return name of column by Max(values) in BigQuery. Error: " No matching signature for operator CASE;" inbigquery 【发布时间】:2020-06-23 20:09:21 【问题描述】:

我的查询应该是根据列的最大值返回 COLUMN NAME。我尝试使用 CASE WHEN 来解决这个案例。但不知何故会发生此错误,可能是因为我返回列的名称而不是列本身的值:

No matching signature for operator CASE; all THEN/ELSE arguments must be coercible to a common type but found: INT64, STRING; actual argument types (WHEN THEN) ELSE: (BOOL STRING) (BOOL INT64) INT64 at [3:5]

我的代码是:

SELECT
ID,
    CASE
        WHEN col1 >= col2 AND col1 >= col3 AND col1 >= col4 AND col1 >= col5 THEN 'col1 '
        WHEN col2 >= col1 AND col2 >= col3 AND col2 >= col4 AND col2 >= col5 THEN 'col2 '
        ELSE 'col1'                                
    END AS Max_Column_Name
FROM table

示例输入是:

有什么方法可以让这个查询更简单吗?因此,如果有很多列,则无需重复 when..case。其他举措是在post 中使用 GREATEST(col1,col2,col3) 但是,我不确定如何在标准 sql、bigquery 中使用它。

【问题讨论】:

【参考方案1】:

以下适用于 BigQuery 标准 SQL,适用于任意数量的列,不需要提前知道列名

#standardSQL
SELECT id, 
  ( SELECT TRIM(col_name, '"')
    FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'"\w+":[^,]+')) kv,
    UNNEST([STRUCT(SPLIT(kv,':')[OFFSET(0)] AS col_name, SPLIT(kv,':')[OFFSET(1)] AS col_value)])
    ORDER BY SAFE_CAST(col_value AS INT64) DESC
    LIMIT 1
  ) AS Max_Column_Name
FROM `project.dataset.table` t   

如果应用到您的问题中的示例示例(使用初始脚本中的 col 命名) - 结果是

Row id  Max_Column_Name  
1   abc col3     
2   def col6     

如果使用完全相同的代码,但对于列名称与示例输入示例中相同的数据 - 结果是

Row id  Max_Column_Name  
1   abc Country_EN   
2   def Country_CA   

【讨论】:

以上是关于在 BigQuery 中按 Max(values) 返回列的名称。错误:“运算符 CASE 没有匹配的签名;”大查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在bigquery中按月创建分区

在 BigQuery 中按字母顺序连接列

在 bigquery 中按月显示数据

如何在bigquery中按月/年汇总

在 Bigquery 中按用户计算登录之间的时间

unnest 是不是始终在 Bigquery 中按命中数的升序显示数据