【发布时间】:2021-05-29 00:02:13
【问题描述】:
从 Postgres 文档 (https://www.postgresql.org/docs/9.6/sql-createaggregate.html) 我发现很难推断出参数 SORTOP 的作用。 此选项是否仅适用于 有序集聚合?
具体来说,我正在尝试创建一个聚合函数,该函数可以在一列数字中找到最常见的数字。我以为指定 SORTOP 选项会在执行我的自定义聚合函数之前对数据进行排序,但事实并非如此。
这是我当前的实现,仅在输入数据排序后才有效。 它循环遍历行并跟踪先前数字的最大序列(状态中的 largfreq 变量)以及目前看到的数字的重复量(状态中的 currfreq 变量)。
CREATE TYPE largfreq_state AS (
largfreq_val INT,
largfreq INT,
currfreq_val INT,
currfreq INT
);
CREATE FUNCTION slargfreq(state largfreq_state, x INT) RETURNS largfreq_state AS $$
BEGIN
if state.currfreq_val <> x then
if state.currfreq >= state.largfreq then
state.largfreq = state.currfreq;
state.largfreq_val = state.currfreq_val;
end if;
state.currfreq = 1;
state.currfreq_val = x;
else
state.currfreq = state.currfreq + 1;
end if;
return state;
END;
$$ language plpgsql;
CREATE FUNCTION flargfreq(state largfreq_state) RETURNS INT AS $$
BEGIN
if state.currfreq >= state.largfreq then
return state.currfreq_val;
else
return state.largfreq_val;
end if;
END;
$$ language plpgsql;
CREATE AGGREGATE largfreq(INT) (
SFUNC = slargfreq,
STYPE = largfreq_state,
FINALFUNC = flargfreq,
INITCOND = '(0, 0, 0, 0)',
SORTOP = <
);
【问题讨论】:
标签: sql postgresql aggregate-functions plpgsql