自定义聚合函数:实现滑动窗口的加权中位数
编写一个支持窗口子句的聚合函数,用于金融时间序列数据的滑动加权中位数计算,超越内置median实现。 · 难度:入门 · +10XP
聚合函数:从零构建分析利器
本教程创建weighted_median聚合,支持ORDER BY和ROWS BETWEEN窗口。利用CREATE AGGREGATE的SFUNC和FINALFUNC,内部使用plpython3u或纯SQL实现加权二分查找。重点处理内存优化:使用INTERNAL状态数据类型存储预排序的数组。最后在ORDER BY窗口中使用EXCLUDE CURRENT ROW实现排除自身的效果。
CREATE AGGREGATE weighted_median(value numeric, weight numeric) (
SFUNC = weighted_median_accum,
STYPE = numeric[],
FINALFUNC = weighted_median_final,
INITCOND = '{}'
);
-- 使用示例
SELECT date, weighted_median(price, volume) OVER (ORDER BY date ROWS BETWEEN 5 PRECEDING AND CURRENT ROW)
FROM trades;