我正在使用 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='{}'
);
但是,作为用户定义的平均值,使用大表可能会很慢(将 sum/count 与内置 AVG 函数进行比较)。 使用 PostgreSQL 9+,没有直接(内置)函数来计算统计模式值吗? 也许使用pg_stats
...如何做类似的事情
SELECT (most_common_vals(int_value))[1] AS modal_value FROM t;
pg_stats VIEW 可以用于这种任务(甚至一次,手动)?