PostgreSQL统计模式值

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视图可用于这样的任务(甚至有一次,通过手)?

ars*_*ars 5

从PostgreSQL 9.4开始,内置了聚合函数mode。它像

SELECT mode() WITHIN GROUP (ORDER BY some_value) AS modal_value FROM tbl;
Run Code Online (Sandbox Code Playgroud)

在此处阅读有关有序集合聚合函数的更多信息:

36.10.3。有序集合聚合

内置的有序集合聚合函数

有关处理较旧版本的Postgres的其他答案。