我已经看过许多在oracle中滚动平均的示例,但是确实做了我想要的。
这是我的原始数据
DATE SCORE AREA
----------------------------
01-JUL-14 60 A
01-AUG-14 45 A
01-SEP-14 45 A
02-SEP-14 50 A
01-OCT-14 30 A
02-OCT-14 45 A
03-OCT-14 50 A
01-JUL-14 60 B
01-AUG-14 45 B
01-SEP-14 45 B
02-SEP-14 50 B
01-OCT-14 30 B
02-OCT-14 45 B
03-OCT-14 50 B
这是我的滚动平均值的理想结果
MMYY AVG AREA
-------------------------
JUL-14 60 A
AUG-14 52.5 A
SEP-14 50 A
OCT-14 44 A
JUL-14 60 B
AUG-14 52.5 B
SEP-14 50 B
OCT-14 44 B
我需要它的工作方式是,对于每个MMYY,我需要回顾3个月,然后AVG每部门的得分。例如
对于OCT的A区,从八月开始的最近三个月中,进行了6个研究,(45 + 45 + 50 + 30 + 45 + 50)/ 6 = 44.1
通常我会这样写查询
SELECT
AREA,
TO_CHAR(T.DT,'MMYY') MMYY,
ROUND(AVG(SCORE)
OVER (PARTITION BY AREA ORDER BY TO_CHAR(T.DT,'MMYY') ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),1)
AS AVG
FROM T
这将查看最近的3个输入,而不是最近的3个月
一种方法是将聚合函数与分析函数混合。平均值的关键思想是避免使用avg()
取而代之sum()
的count(*)
。
SELECT AREA, TO_CHAR(T.DT, 'MMYY') AS MMYY,
SUM(SCORE) / COUNT(*) as AvgScore,
SUM(SUM(SCORE)) OVER (PARTITION BY AREA ORDER BY MAX(T.DT) ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) / SUM(COUNT(*)) OVER (PARTITION BY AREA ORDER BY MAX(T.DT) ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
FROM t
GROUP BY AREA, TO_CHAR(T.DT, 'MMYY') ;
注意该order by
条款。如果您的数据跨越几年,则使用MMYY格式会带来问题。几个月之内最好使用YYYY-MM之类的格式,因为字母顺序与自然顺序相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句