Snowflake中的argmin/argmax聚合是否有解决方法



我正在研究一种类似于Hive或Presto的计算Snowflake中多行的argmin或argmax聚合的方法。

在Hive中,可以对(命名的(structs使用变通方法,因为聚合函数将应用于structs的第一个元素。这里有一个例子:

SELECT max(named_struct('y', y, 'x', x)).x FROM t

现在我在问自己,在Snowflake中是否有类似的方法。

在Snowflake中,我们有一个具有类似属性的OBJECT数据类型。我可以像Hive示例中那样使用以下代码来计算argmin或argmax吗?对象的最小/最大聚合是否也在对象的第一个元素上执行?

SELECT max(object_construct('y', y, 'x', x)).x FROM t

运行上面的代码会返回一个错误:SQL compilation error: Function MAX does not support OBJECT argument type.。它实际上不支持任何复杂的类型。

如果我正确理解了argmin((的逻辑,那么您可以将其实现为javascript UDF,如下所示:

create or replace function argmin("a" object, "b" object)
returns object
language javascript
as
$$
for (let [k,v] of Object.entries(a))
if (v==b[k])
continue
else 
return v < b[k] ? a : b
return b
$$;

并像这样应用:

with t as (
select 
object_construct('x',1, 'y',2) a, 
object_construct('x',2, 'y',1) b
)
select argmin(t.a,t.b):y from t;

实际上,此功能内置于:

select 
object_construct('x',1, 'y',2) a, 
object_construct('x',2, 'y',1) b, 
iff(a<b, a, b) : y
;

更简洁地说:

select 
object_construct('x',1, 'y',2) a, 
object_construct('x',2, 'y',1) b,
least(a,b):y,
greatest(a,b):y;

最新更新