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

Filtering time series data based on previous result row values in PostgreSQL

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

如果配置的间隔是 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 <-

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

我什至不确定这是否可以完成,因为要返回的行取决于之前的结果。所以我的问题是,这是否可以通过 Postgres 9.3 以一种高效的方式完成。

恐怕这不能用 window 函数解决,因为行(必须返回)取决于以前的结果,如您所述。

但这正是 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

但是请注意,此解决方案将逐行搜索结果,因此它不会对大型结果集有效。