在 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 没有匹配的签名;”大查询的主要内容,如果未能解决你的问题,请参考以下文章