想在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条记录的移动平均值。
有没有办法计算不包括当前行的移动平均线。?
答案 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的答案明显优越。尽管如此,我仍然离开了我的地方,因为它仍然可以运作,如果不必要的那么复杂。
答案是单独获取sum
和count
,减去当前行然后除以两个结果。这有点难看,但它应该有效:
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
时删除当前行。