我有一个表,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,因为这样会很慢.
不完全清楚您的表结构和数据的唯一性,但此查询将为您提供所有时间戳的前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)