聚合模式

来自 PostgreSQL 维基
跳转到导航跳转到搜索

统计学中,众数是值集中出现次数最多的值。


Postgres 9.4 具有内置聚合函数 mode()

新的有序集聚合函数取代了下面的自定义聚合函数。更重要的是,它也与之冲突。要安装它,请使用不同的名称。功能(几乎)相同,但新的内置函数速度快得多

细微差异

  • 像大多数内置聚合函数一样,NULL 值会被忽略。如果最常见的 value 为 NULL,则内置mode()返回第二常见的 value。
  • 内置mode()如果表达式在所有行中都为 NULL,则不会返回错误。而是返回 NULL。

用法

新语法不同

SELECT mode() WITHIN GROUP (ORDER BY some_value) AS modal_value FROM tbl;

另请参见

Postgres 9.3 或更早版本的 mode()(在 9.4 中已过时)

代码片段

聚合模式

适用于 PostgreSQL

任何版本

SQL

依赖于


PostgreSQL 使得添加自定义聚合函数变得容易。此代码片段也是 ulib_agg 用户定义库的一部分。

从概念上讲,该过程将把每个 value 收集到一个数组中。然后,一旦所有 value 都在数组中,我们将运行一个函数来查找数组中最常见的 value。然后,您需要创建一个函数来查找数组中最常见的 value。

CREATE OR REPLACE FUNCTION _final_mode(anyarray)
  RETURNS anyelement AS
$BODY$
    SELECT a
    FROM unnest($1) a
    GROUP BY 1 
    ORDER BY COUNT(1) DESC, 1
    LIMIT 1;
$BODY$
LANGUAGE sql IMMUTABLE;

-- Tell Postgres how to use our aggregate
CREATE AGGREGATE mode(anyelement) (
  SFUNC=array_append, --Function to call for each row. Just builds the array
  STYPE=anyarray,
  FINALFUNC=_final_mode, --Function to call after everything has been added to array
  INITCOND='{}' --Initialize an empty array when starting
);

用法

SELECT mode(some_value) AS modal_value FROM t;

注意

如果参数是 NULL 值的列,则返回错误。

如果您使用的是 PostgreSQL 8.3 或更早版本,则需要添加 unnest() 函数将数组转换为一组行。

另请参见

外部链接