为什么 Postgres "mode" 函数与 "avg"、"max" 和其他聚合函数如此不同?
Why is the Postgres "mode" function so different from "avg", "max", and other aggregates?
在 Postgres 中,我可以说 select avg(size) from images
和 select 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 结果的最快方法。
没有像计算其他东西那样计算众数的“机器公式”。对于最小值或最大值,您只需跟踪到目前为止看到的最小值或最大值。例如,对于平均值,您可以只跟踪到目前为止看到的总和和计数。使用该模式,您需要让所有数据触手可及。
使用有序集聚合自动提供此类用例,包括在数据变大时将数据假脱机到磁盘上的临时文件。
您可以改为编写代码将数据聚合到内存中,然后从那里处理它(如其他答案参考),但这会变得缓慢并且容易崩溃,因为所需的内存量开始超过内存量可用。
在 Postgres 中,我可以说 select avg(size) from images
和 select 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 结果的最快方法。
没有像计算其他东西那样计算众数的“机器公式”。对于最小值或最大值,您只需跟踪到目前为止看到的最小值或最大值。例如,对于平均值,您可以只跟踪到目前为止看到的总和和计数。使用该模式,您需要让所有数据触手可及。
使用有序集聚合自动提供此类用例,包括在数据变大时将数据假脱机到磁盘上的临时文件。
您可以改为编写代码将数据聚合到内存中,然后从那里处理它(如其他答案参考),但这会变得缓慢并且容易崩溃,因为所需的内存量开始超过内存量可用。