为什么 Postgres "mode" 函数与 "avg"、"max" 和其他聚合函数如此不同?

Why is the Postgres "mode" function so different from "avg", "max", and other aggregates?

在 Postgres 中,我可以说 select avg(size) from imagesselect max(size) from images

但是当我想要the mode我可能不会这样做:

select mode(uploaded_by_id) from images

相反我必须这样做:

select mode() within group (order by uploaded_by_id desc) from images

我觉得语法有点古怪。有谁知道为什么不允许使用其他语法?

注意:我知道允许 order by 允许用户定义在平局的情况下采用哪种模式,但我不明白为什么需要完全禁止其他语法。

谢谢!

在查看文档后,他们似乎从一个简单的函数转向了 window 函数,他们将速度优势作为这样做的原因。

https://wiki.postgresql.org/wiki/Aggregate_Mode

如果您愿意,您可以自己创建一个函数,但似乎 window 函数是从数据库返回 NOT NULL 结果的最快方法。

没有像计算其他东西那样计算众数的“机器公式”。对于最小值或最大值,您只需跟踪到目前为止看到的最小值或最大值。例如,对于平均值,您可以只跟踪到目前为止看到的总和和计数。使用该模式,您需要让所有数据触手可及。

使用有序集聚合自动提供此类用例,包括在数据变大时将数据假脱机到磁盘上的临时文件。

您可以改为编写代码将数据聚合到内存中,然后从那里处理它(如其他答案参考),但这会变得缓慢并且容易崩溃,因为所需的内存量开始超过内存量可用。