Pet*_*uss 3 postgresql statistics
我正在使用SQL查询
SELECT round(avg(int_value)) AS modal_value FROM t;
Run Code Online (Sandbox Code Playgroud)
要获得模态值,这当然是不正确的,但它是显示某些结果的首选。
所以,我的问题是,“ 如何正确地做事情? ”。
在PostgreSQL 8.3+中,我们可以使用以下用户定义的聚合定义模式:
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='{}'
);
Run Code Online (Sandbox Code Playgroud)
但是,作为用户定义的平均值,使用大表可能会比较慢(将总和/计数与内置AVG函数进行比较)。 在PostgreSQL 9+中,没有直接的(内置)函数来计算统计模式值吗? 也许使用pg_stats... 如何做类似的事情
SELECT (most_common_vals(int_value))[1] AS modal_value FROM t;
Run Code Online (Sandbox Code Playgroud)
该pg_stats视图可用于这样的任务(甚至有一次,通过手)?
从PostgreSQL 9.4开始,内置了聚合函数mode。它像
SELECT mode() WITHIN GROUP (ORDER BY some_value) AS modal_value FROM tbl;
Run Code Online (Sandbox Code Playgroud)
在此处阅读有关有序集合聚合函数的更多信息:
有关处理较旧版本的Postgres的其他答案。