⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

创建自定义聚合函数:从简单累加到滑动窗口统计

讲解如何使用 CREATE AGGREGATE 定义自己的聚合函数,包括状态转移函数、最终函数,以及实现滑动窗口统计(如移动平均)。 · 难度:入门 · +10XP

自定义聚合函数

PostgreSQL 允许你使用 PL/pgSQL 或 C 语言创建自定义聚合函数。一个聚合函数由状态转移函数(处理每行)、最终函数(可选,输出最终结果)和初始状态组成。典型应用:实现移动平均、累积乘积、复杂统计量。例如,计算数值的加权移动平均,可以定义状态为队列,转移函数不断入队出队,最终函数计算平均值。

-- 创建自定义聚合:移动平均(窗口大小为3)
CREATE FUNCTION moving_avg_sfunc(state NUMERIC[], value NUMERIC) RETURNS NUMERIC[] AS $$
BEGIN
    state := array_append(state, value);
    IF array_length(state, 1) > 3 THEN
        state := state[2:];
    END IF;
    RETURN state;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
CREATE FUNCTION moving_avg_finalfunc(state NUMERIC[]) RETURNS NUMERIC AS $$
BEGIN
    RETURN (SELECT AVG(v) FROM unnest(state) AS v);
END;
$$ LANGUAGE plpgsql IMMUTABLE;
CREATE AGGREGATE moving_avg(NUMERIC) (
    SFUNC = moving_avg_sfunc,
    STYPE = NUMERIC[],
    FINALFUNC = moving_avg_finalfunc,
    INITCOND = '{}'
);
-- 使用
SELECT id, value, moving_avg(value) OVER (ORDER BY id) FROM data_table;
Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 131 篇
0 完成
🔥 0