我正在使用postgres 9.1.11并创建了一个函数来累积分区上的变量(ln_ret),最终返回我想要的列(cumret_pf)。参数start_date和end_date确定我希望相关分区的宽度。
我的问题是,如果分区中有足够的行,我只想要返回一个结果,例如如果我指定分区在当前变量之前开始2行,我希望分区中的前两行为null。
我已经能够使用下面的代码实现当前行之前的行,但是当我考虑当前行之后的行时,无法实现所需的结果。我可以计算一个变量,例如“反向”行号,并对end_date执行等效限制,如下所示吗?有没有更好的方法来限制我的结果?非常感谢
select allrows.rnum,
allrows.permno,
allrows.date,
allrows.ln_ret,
allrows.sum_ln_ret,
cast(exp(allrows.sum_ln_ret) - 1 as numeric(18,6)) as cumret_pf
from
(select cast(row_number() over (partition by a.permno order by a.date) as bigint) as rnum,
a.permno,
a.date,
a.ln_ret,
sum(a.ln_ret) over (partition by a.permno order by a.date rows between 3 PRECEDING and 3 FOLLOWING) as sum_ln_ret
from returns.msf_mse as a
where a.ln_ret is not null and permno = 10000
order by a.permno, a.date) as allrows
where rnum > 3;
我的输出当前如下所示(当使用修改后的代码中所示的前/后3行窗口时)。我希望能够将最后三行中的cumret_pf的值设置为null(或者将它们全部删除,就像前三行一样)。我不想对行号进行硬编码,因为我的完整数据集有数千个不同长度的分区。
rnum;permno;date;ln_ret;sum_ln_ret;cumret_pf
--------------------------------------------------
4;10000;"1986-05-30";-0.251872;-1.386295;-0.750000
5;10000;"1986-06-30";-0.005038;-1.147884;-0.682693
6;10000;"1986-07-31";-0.084260;-1.736951;-0.823944
7;10000;"1986-08-29";-0.955512;-1.574885;-0.792969
8;10000;"1986-09-30";-0.058841;-1.796797;-0.834171
9;10000;"1986-10-31";-0.277631;-2.030170;-0.868687
10;10000;"1986-11-28";0.058269;-1.945910;-0.857143