【问题标题】:In PostgreSQL what does the CREATE AGGREGATE option SORTOP do?在 PostgreSQL 中,CREATE AGGREGATE 选项 SORTOP 有什么作用?
【发布时间】: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


    【解决方案1】:

    这在the documentation中有很好的解释:

    行为类似于MINMAX 的聚合有时可以通过查看索引而不是扫描每个输入行来优化。如果此聚合可以如此优化,请通过指定排序运算符来指示它。基本要求是聚合必须产生运算符诱导的排序顺序中的第一个元素;换句话说:

    SELECT agg(col) FROM tab;
    

    必须等同于:

    SELECT col FROM tab ORDER BY col USING sortop LIMIT 1;
    

    因此,对于可以使用索引扫描计算的聚合,您需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 2012-05-13
      • 2023-02-24
      • 2020-01-18
      • 2016-11-09
      • 2016-11-02
      相关资源
      最近更新 更多