Aggregation 如何在自定义Presto聚合函数中强制执行排序(ORDER BY)

Aggregation 如何在自定义Presto聚合函数中强制执行排序(ORDER BY),aggregation,partitioning,presto,nosql-aggregation,trino,Aggregation,Partitioning,Presto,Nosql Aggregation,Trino,我正在编写一个定制的Presto聚合函数,该函数在(且仅当)值按我正在聚合的值的升序排序时,生成正确的结果。i、 e 以下工作将起作用: SELECT key, MY_AGG_FUNC(value ORDER BY value ASC) FROM my_table GROUP BY key 以下情况将产生不正确的结果: SELECT key, MY_AGG_FUNC(value) FROM my_table GROUP BY key 在开发MY\u AGG\u FUNC时,是否有办法在内部强

我正在编写一个定制的Presto聚合函数,该函数在(且仅当)值按我正在聚合的值的升序排序时,生成正确的结果。i、 e

以下工作将起作用:

SELECT key, MY_AGG_FUNC(value ORDER BY value ASC) FROM my_table GROUP BY key
以下情况将产生不正确的结果:

SELECT key, MY_AGG_FUNC(value) FROM my_table GROUP BY key
在开发
MY\u AGG\u FUNC
时,是否有办法在内部强制执行
按值排序ASC
,而不依赖调用方将其添加到查询中

或者,如果用户根本没有指定ORDER BY(或错误的排序),是否有方法引发异常

在开发MY_AGG_FUNC时,是否有一种方法可以在内部强制执行按值排序ASC,而不依赖调用者将其添加到查询中

没有办法做到这一点

或者,如果用户根本没有指定ORDER BY(或错误的排序),是否有方法引发异常


除了在聚合函数实现中检查接收的值是否按升序排列之外,没有其他方法可以做到这一点。

因此我可以将“前一个值”保持在聚合函数的“状态”中,如果“下一个值”严格小于“前一个值”,则抛出异常。这将增强正确性我猜如果我确实需要对输入进行排序,
@CombineFunction
的作用是什么?i、 e.实现就像一个“折叠”(必须从第一行开始计算)。内部分区是否有可能影响最终结果?正确,但您也可以检测到这一点。这与其他内置聚合函数以及SQL的行为一致:如果调用方需要排序,他应该明确说明。谢谢!您能给我指出一个在运行时强制执行该功能的内置聚合函数吗?我的意思是,不实现默认排序策略与内置的操作是一致的。它们中的一些接受
ORDER BY
子句(
arry_agg()
string_agg()
,…)-如果调用方没有指定它,结果的顺序就没有定义。不过,我对
@CombineFunction
的实现有点困惑。组/分区是否会进一步拆分?如果是这样,一个分区可能处于“中间”,而不是从最小值开始处理该分区。我试图在这里执行“折叠”操作。