我正在使用 SQL 查询
SELECT round(avg(int_value)) AS modal_value FROM t;
获取modal value ,那当然不是正确的,但它是显示某些结果的第一个选项。
所以,我的问题是,“如何正确地做事?”。
对于 PostgreSQL 8.3+,我们可以使用 this user-defined agregate 定义模式:
CREATE FUNCTION _final_mode(anyarray) RETURNS anyelement AS $f$
SELECT a FROM unnest($1) a
GROUP BY 1 ORDER BY COUNT(1) DESC, 1
LIMIT 1;
$f$ LANGUAGE 'sql' IMMUTABLE;
CREATE AGGREGATE mode(anyelement) (
SFUNC=array_append, STYPE=anyarray,
FINALFUNC=_final_mode, INITCOND='{}'
);
但是,作为用户定义的平均值,对于大表它可能会很慢(将 sum/count 与内置 AVG 函数进行比较)。 在 PostgreSQL 9+ 中,没有直接(内置)函数来计算统计模式值?也许使用 pg_stats
... 如何做类似的事情
SELECT (most_common_vals(int_value))[1] AS modal_value FROM t;
pg_stats VIEW 可用于此类任务(即使是手动一次)?
最佳答案
从 PostgreSQL 9.4 开始,有一个内置的聚合函数 mode
。它像这样使用
SELECT mode() WITHIN GROUP (ORDER BY some_value) AS modal_value FROM tbl;
在此处阅读有关有序集合聚合函数的更多信息:
36.10.3. Ordered-Set Aggregates
Built-in Ordered-Set Aggregate Functions
请参阅处理旧版本 Postgres 的其他答案。
关于PostgreSQL 统计模式值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16189768/