PostgreSQL 统计模式值

标签 postgresql statistics

我正在使用 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/

相关文章:

r - 在不知道列名的情况下使用 NA 高效地添加数字列和行

r - 功效与效应大小图

php - 在带有准备好的语句的 INSERT 或 UPDATE 中使用 NULL 值

sql - 使用sql保留列中的特定字符

检测我的数字异常增长/下降的算法

r - 确定 R 中分布的高密度区域

unit-testing - 关于开发人员花多少时间修复单元测试/集成测试的统计数据?

sql - 有没有一种更优雅的方法来检测大型SQL表中的更改而不进行更改?

sql - 在单个列上进行复杂选择

java - Redshift 和 Postgres JDBC 驱动程序都拦截 jdbc ://postgresql connection string