计算所有条目的移动平均值

leo*_*sas 0 sql oracle

我有一个表,Measures与列:timestamp(Unix时间戳)tag,value.要获得15天的单一移动平均线,我可以做类似的事情:

SELECT tag,avg(value) 
FROM measures 
 WHERE tag='xtr' 
 AND timestamp<1353304800
 AND timestamp>1350622800 
 GROUP BY tag;
Run Code Online (Sandbox Code Playgroud)

现在我想获得150个最新行的移动平均值,但我不确定如何查询它.

SELECT t, s,avg(bv) 
FROM 
  (SELECT A.timestamp as t,A.tag as ta,A.value as ac, B.timestamp as tb,B.value as bv, 
  FROM measures 
  CROSS JOIN measures B 
  WHERE A.tag='xtr' AND B.tag='xtr' 
  GROUP BY A.tag) WHERE ROWNUM <= 150;
Run Code Online (Sandbox Code Playgroud)

这显然是错误的,但我一直在思考它并且无法弄明白.有任何想法吗?我的思路是,我需要将每个条目与其下方的150个条目相匹配,并计算value这150个条目的平均值.我也很确定没有a可能有更好的方法CROSS JOIN,因为这样会很慢.

Dav*_*dge 6

不完全清楚您的表结构和数据的唯一性,但此查询将为您提供所有时间戳的前150行(包括当前行)的真实移动平均值.

SELECT
  tag,
  timestamp,
  avg(value) over (partition by tag
                   order by timestamp asc
                   rows between 149 preceding and current row) moving_avg
FROM
  measures 
WHERE
  tag='xtr' 
Run Code Online (Sandbox Code Playgroud)

如果您只需要隔离最近的150行,那么请将查询基于:

select
  tag,
  value
from(
  select tag
         value
  from measures
  order by timestamp desc)
where
  rownum <= 150
Run Code Online (Sandbox Code Playgroud)