Domanda

Would like to calculate moving average in oracle for the last 30 records excluding current row.

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

The above SQL calculates moving average for 30 records including current row.

Is there any way to calculate moving average excluding current row.?

È stato utile?

Soluzione

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

Altri suggerimenti

@be_here_now's answer is clearly superior. I'm leaving mine in place nonetheless, as it's still functional, if needlessly complex.


An answer would to be to get the sum and count individually, subtract out the current row then divide the two results. It's a little ugly, but it should work:

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

If curr_0380 can be null, you'd have to tweak this slightly so that the current row is removed only if it's not null.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top