Postgresql Postgres窗口函数输出限制

Postgresql Postgres窗口函数输出限制,postgresql,postgresql-9.1,window-functions,Postgresql,Postgresql 9.1,Window Functions,我正在使用postgres 9.1.11,并创建了一个函数来在分区上累积一个变量(ln_-ret),最终返回我想要的列(cumret_-pf)。参数start_date和end_date决定了我希望相关分区的宽度 我的问题是,我只希望在分区中有足够的行时返回结果,例如,如果我指定分区在当前变量之前开始两行,我希望分区中的前两行为null 我已经能够用下面的代码实现当前行前面的行,但是当我考虑行的当前行时,无法获得期望的结果。我是否可以计算一个变量,如“反向”行号,并对结束日期执行等效限制,如下所

我正在使用postgres 9.1.11,并创建了一个函数来在分区上累积一个变量(ln_-ret),最终返回我想要的列(cumret_-pf)。参数start_date和end_date决定了我希望相关分区的宽度

我的问题是,我只希望在分区中有足够的行时返回结果,例如,如果我指定分区在当前变量之前开始两行,我希望分区中的前两行为null

我已经能够用下面的代码实现当前行前面的行,但是当我考虑行的当前行时,无法获得期望的结果。我是否可以计算一个变量,如“反向”行号,并对结束日期执行等效限制,如下所示?有没有更好的方法来限制我的结果?非常感谢

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

您能提供此查询的实际输出与期望输出吗?对于反向行数,一种粗略的方法是计算分区中的行数,并从当前行数中减去行数TANKS mlt。这很好用。