有没有办法在聚合调用中不使用 ORDER BY 对 postgresql 自定义聚合中的行进行预排序?

Posted

技术标签:

【中文标题】有没有办法在聚合调用中不使用 ORDER BY 对 postgresql 自定义聚合中的行进行预排序?【英文标题】:Is there a way to pre-sort the rows in a postgresql custom aggregate without using ORDER BY in the aggregate call? 【发布时间】:2021-11-03 17:11:09 【问题描述】:

我在 pl/pgsql 中创建了一个自定义聚合,它要求行以某种方式相对于输入列进行排序。我可以通过在聚合调用中使用ORDER BY 来完成此操作。我希望在聚合调用中不明确声明ORDER BY 的情况下进行这种排序。

例如我有聚合函数 f(A 文本,B 文本)。我可以通过这样调用它来得到正确的计算:

select
    X,
    Y,
    f(A, B order by A, B)
from
    table

group by
    X,
    Y

我希望能够像这样调用它并在自定义聚合的定义中指定排序。

select
    X,
    Y,
    f(A, B)

from
    table

group by
    X,
    Y

这可能吗?

【问题讨论】:

我知道在某些情况下,如果您的数据以正确的顺序插入(并且 rownum 会帮助您),您将实现这一点,但据我所知,您必须使用 ORDER BY if您希望确保订单得到遵守。 【参考方案1】:

如果您希望聚合对输入值进行排序,您可能必须编写状态更改函数,以便它只收集输入并在最终函数中执行排序。如果您为大型表缓存数据,这可能需要大量内存。

根据聚合的作用,您可能会提出更好的解决方案,但不能依赖于值的特定顺序。

【讨论】:

以上是关于有没有办法在聚合调用中不使用 ORDER BY 对 postgresql 自定义聚合中的行进行预排序?的主要内容,如果未能解决你的问题,请参考以下文章

mysql_group by与聚合函数order by联合使用

如何在 SQL 中不使用“ORDER BY”进行升序排序

子查询中不允许用order by子句,那么应该怎么办?

order by 和 group by 的区别?

OVER 子句中的 SQL ORDER BY 与 CLR 聚合不兼容?

聚合函数种类和功能有哪些和分组查询 group by 与 order by的区别?