PostgreSQL - 自定义聚合函数

时间:2017-09-29 09:33:16

标签: postgresql

我正在浏览由PostgreSQL提供的遗留应用程序的代码(我认为它是PG版本9.1)。

我遇到过这个函数 - 我想这是自定义聚合,但不明白它在做什么:

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
);

任何人都可以解释这个功能在做什么吗?

1 个答案:

答案 0 :(得分:3)

此聚合函数将返回最常出现的元素,如果有更多元素经常出现,则使用首先排序的元素来打破平局。

在表格atab

 x
---
 a
 z
 q
 a
 b
 a
 z
 z

您将获得以下内容:

SELECT mode(x) FROM atab;

 mode
------
    a
(1 row)

因为az都出现了三次,但a在词法z之前排序。