没有当前行的Oracle移动平均线

时间:2014-05-14 15:41:47

标签: oracle plsql

想在oracle中计算除当前行之外的最后30个记录的移动平均线。

select crd_nb, flng_month, curr_0380,
avg(curr_0380) over (partition by crd_nb order by flng_month ROWS 30 PRECEDING) mavg
from us_ordered

以上SQL计算包括当前行在内的30条记录的移动平均值。

有没有办法计算不包括当前行的移动平均线。?

2 个答案:

答案 0 :(得分:2)

select 
  crd_nb, 
  flng_month, 
  curr_0380,
  avg(curr_0380) over (
    partition by crd_nb 
    order by flng_month 
    ROWS between 30 PRECEDING and 1 preceding
  ) mavg
from us_ordered

答案 1 :(得分:1)

@ be_here_now的答案明显优越。尽管如此,我仍然离开了我的地方,因为它仍然可以运作,如果不必要的那么复杂。


答案是单独获取sumcount,减去当前行然后除以两个结果。这有点难看,但它应该有效:

SELECT crd_nb,
       flng_month,
       curr_0380,
         (  SUM (curr_0380)
            OVER (PARTITION BY crd_nb 
                  ORDER BY flng_month ROWS 30 PRECEDING)
          - curr_0380)
       / (  COUNT (curr_0380)
            OVER (PARTITION BY crd_nb 
                  ORDER BY flng_month ROWS 30 PRECEDING)
          - 1)
          mavg
FROM   us_ordered

如果curr_0380可以是null,则您必须稍微调整一下,以便仅在not null时删除当前行。