我的查询应该根据列的最大值返回列名。我试着用case来解决这个案子。但不知怎的,出现了这个错误,可能是因为我返回的是列的名称,而不是列本身的值:
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。另一个倡议是像本文一样使用greatest(col1,col2,col3),但我不知道如何在标准sql bigquery中使用它。
预期产量:
返回对每个段(国家/地区、产品、语言)具有最大值的列的名称,并重命名结果表中列的名称。
3条答案
按热度按时间wkftcu5l1#
假设你没有
NULL
值,可以使用greatest()
:也可以使用数组:
bweufnob2#
下面是bigquery标准sql
它在某种程度上是非常通用的-如果您有更多或不同的段和它们的名称-您只需要在大多数外部选择中反映它-在像这样的行中(
MAX(IF(segment = 'SegmentName', winner, NULL)) AS SegmentName
),其余部分在内部查询中处理如果要应用于样本数据,如您的问题-输出是
注意:最近引入的execute immediate将允许您进一步概括上述解决方案,因此您甚至不必担心最外层select中的行—我将把它留给您,因为它完全超出了主要问题的范围
00jrzges3#