Continuous Views是随着时间持续并不断更新的,PipelineDB在更新一个流视图结果时也能考虑到当前时间。滑动窗口查询是指查询时包含where子句以及和当前时间相关的临时组件。事件集where子句过滤或接受改变。
关于一个滑动where子句有两个重要的组件
clock_timestamp()---一个内置函数用来返回当前时间戳
arrival_timestamp一个特别的属性,PipelineDB接收的包含时间的记录。
然而,没有必要显示增加where子句,PipelineDB内部实现它,只需要指定sw存储参数,在定义流视图时。
下面通过例子来显示:
尽管滑动窗口是一个新的概念,但是PipelineDB并没有使用新的或合适的语法。取而代之的,PipelineDB
还是使用PostgreSQL 9.5的语法
1、在最新的一分钟内我能查到哪些用户。
CREATE CONTINUOUS VIEW recent_users WITH(sw = '1 minute') AS
SELECT user_id::integer FROM stream;
CREATE CONTINUOUS VIEW recent_users AS
SELECT user_id::integer FROM stream
WHERE (arrival_timestamp>clock_timestamp()-interval ‘1 minute’);
NOTE:PipelineDB运行用户手动构造滑动窗口where子句当定义滑动窗口流视图,尽管它推荐使用sw来避免单调(tedium)
由于是查最新1分钟,所以你重新查询都会有不同的行,尽管流视图没有更新。
分析下面这一句:
(arrival_timestamp > clock_timestamp() - interval '1 minute')
(1)先计算这个:clock_timestamp() - interval '1 minute'得到的结果k
(2)arrival_timestamp >k 说明就在这个1分钟的范围内
NOTE:current_date,current_time,current_timestamp并不用在滑动窗口查询.
滑动聚集,对应有Continuous Aggregates
CREATE CONTINUOUS VIEW count_recent_users WITH (sw = '1 minute') AS SELECT COUNT(*) FROM stream;
CREATE CONTINUOUS VIEW sensor_temps WITH (sw = '5 minutes') AS SELECT sensor::integer, AVG(temp::numeric) FROM sensor_stream GROUP BY sensor;
What is my server’s 99th precentile response latency over the last 5 minutes?
CREATE CONTINUOUS VIEW latency WITH (sw = '5 minutes') AS
SELECT server_id::integer, percentile_cont(0.99)
WITHIN GROUP (ORDER BY latency::numeric) FROM server_stream
GROUP BY server_id;
CREATE CONTINUOUS VIEW hourly (WITH sw = '1 hour', step_factor = 50) AS SELECT COUNT(*) FROM stream;