我正在使用SQL查询
SELECT round(avg(int_value)) AS modal_value FROM t;
为了获得模态值,当然这不是正确的方法,但这是展示一些结果的第一种选择。
那么,我的问题是,“如何做正确的事情?”。
使用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='{}'
);
然而,作为用户自定义平均值,在处理大表时可能会变得很慢(与内置的AVG函数相比较sum/count)。在PostgreSQL 9+中,没有直接的(内置)函数来计算统计模式值吗?也许可以使用pg_stats
... 如何实现类似的功能呢?
SELECT (most_common_vals(int_value))[1] AS modal_value FROM t;
pg_stats视图可以用于这种任务吗(即使是手动的)?
pg_stat
视图(像任何处理规划器统计信息的表/视图一样)仅包含估计值,而不是精确值。 - Ihor Romanchenko