根据PostgreSQL中先前的结果行值过滤时间序列数据

时间:2015-01-20 14:57:39

标签: postgresql postgresql-9.3

我的表中的数据是时间序列。该表具有timestamp列,其类型为timestamp。我需要过滤此表,以便只有当查询的时间戳大于上一个结果行的时间戳加上配置的时间间隔时,查询才会返回一行。

如果配置的间隔为3秒,我希望返回以下数据中标有箭头的行:

2015-01-20T12:00:00 <-
2015-01-20T12:00:01
2015-01-20T12:00:02
2015-01-20T12:00:03 <-
2015-01-20T12:00:06 <-
2015-01-20T12:00:10 <-
2015-01-20T12:00:12
2015-01-20T12:00:13 <-
2015-01-20T12:00:14
2015-01-20T12:00:15
2015-01-20T12:00:16 <-

我尝试使用窗口函数来获得正确的结果。但问题是我只能以3秒的间隔对结果进行分组,并且从2015-01-20T12:00:12开始返回的解决方案行将会有所不同。

我甚至不确定是否可以这样做,因为要返回的行取决于之前的结果。所以我的问题是,如果可以用有效的方式使用Postgres 9.3来完成。

1 个答案:

答案 0 :(得分:1)

我担心,这不能通过窗口函数解决,因为行(必须返回)取决于之前的结果,正如您所指出的那样。

但这正是recursive CTE的作用:

with recursive r as (
  (select   *
   from     t
   order by ts
   limit    1)
  union all
  (select   t.*
   from     t
   join     r on t.ts >= r.ts + interval '3 sec'
   order by t.ts
   limit    1)
)
select *
from   r;

SQLFiddle

但请注意,此解决方案将逐行搜索结果,因此对于大型结果集无效。