【发布时间】:2017-12-10 03:43:25
【问题描述】:
我正在尝试定义一个 PostgreSQL 聚合函数,该函数知道在 frame 子句中要求但缺少的行。具体来说,让我们考虑一个聚合函数framer,它的工作是返回一个由通过它聚合的值组成的数组,帧中的任何缺失值都返回为null。所以,
select
n,
v,
framer(v) over (order by v rows between 2 preceding and 2 following) arr
from (values (1, 3200), (2, 2400), (3, 1600), (4, 2900), (5, 8200)) as v (n, v)
order by v
应该返回
"n" "v" "arr"
3 1600 {null,null,1600,2400,2900}
2 2400 {null,1600,2400,2900,3200}
4 2900 {1600,2400,2900,3200,8200}
1 3200 {2400,2900,3200,8200,null}
5 8200 {2900,3200,8200,null,null}
基本上,我想获取每个值周围的一系列值,知道我是否缺少左侧或右侧(或可能两者)的任何值对我来说很重要。看起来很简单。我希望这样的事情能够奏效:
create aggregate framer(anyelement) (
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
但它会返回
"n" "v" "arr"
3 1600 {1600,2400,2900}
2 2400 {1600,2400,2900,3200}
4 2900 {1600,2400,2900,3200,8200}
1 3200 {2400,2900,3200,8200}
5 8200 {2900,3200,8200}
所以sfunc实际上只在缺少两个值时被调用了三次。
我想不出任何非可笑的方法来捕捉那些缺失的行。似乎应该有一个简单的解决方案,例如在聚合运行之前以某种方式将一些前哨空值添加/附加到数据中,或者以某种方式将索引(和帧值)以及实际值传递给函数......
我想将它作为一个聚合来实现,因为它为我想做的事情提供了最好的面向用户的体验。有没有更好的办法?
FWIW,我在 postgres 9.6 上。
【问题讨论】:
标签: postgresql aggregate-functions window-functions