我运行的Postgres 9.2和我有一个大的表像滚动平均的Postgres
CREATE TABLE sensor_values
(
ts timestamp with time zone NOT NULL,
value double precision NOT NULL DEFAULT 'NaN'::real,
sensor_id integer NOT NULL
)
我进入系统的价值不断地即多每分钟。我想维持最后200个值的滚动标准偏差/平均值,因此我可以确定进入系统的新值是否在平均值的3个标准偏差之内。要做到这一点,我需要当前的标准偏差和意思是不断更新最后200个值。 由于表格可能有数亿行,我不想最后说200行的传感器按时间排序,然后对每个新值进行vg(value),var_samp(value)。我假设更新标准偏差和平均值会更快。
我已经开始编写一个PL/pgSQL函数来更新每个进入特定传感器系统的新值的滚动方差和平均值。
我可以做到这一点使用码伪像
newavg = oldavg + (new_value - old_value)/window_size
new_variance += (new_value-old_value)*(new_value-newavg+old_value-oldavg)/(window_size-1)
这是基于 http://jonisalonen.com/2014/efficient-and-accurate-rolling-standard-deviation/
基本上窗口大小200个的值。 old_value是窗口的第一个值。当有新的价值出现时,我们将窗口向前移动一个。之后,我得到的结果我存储以下值传感器
The first value of the window.
The mean average of the window values.
The variance of the window values.
这样我就不必不断那里持续200价值,做一个总和etc.I可以重复使用这个值时,一个新的传感器值进来
我的问题是,当第一次运行我没有一个传感器的前一个窗口数据,即上述三个值,所以我必须做的慢的方式。
像
WITH s AS
(SELECT value FROM sensor_values WHERE sensor_values.sensor_id = $1 AND ts >= (NOW() - INTERVAL '2 day')::timestamptz ORDER BY ts DESC LIMIT 200)
SELECT avg(value), var_samp(value) INTO last_window_average, last_window_variance FROM s;
但我怎么能得到最后的值(ealiest),以从select语句救? 我可以在PL/pgSQL中访问s中的第一行吗?
我认为PL/pgSQL会更快/更干净的方法,但也许它更好地做到这一点是客户端代码? 有没有更好的方法在滚动统计更新上执行此类型?
什么'AVG(值)超过(前述200之间分区由sensor_id为了通过TS行和当前行)作为avg' –