聚合模式
来自 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 使得添加自定义聚合函数变得容易。此代码片段也是 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() 函数将数组转换为一组行。