根据 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;
但是请注意,此解决方案将逐行搜索结果,因此它不会对大型结果集有效。
我在 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;
但是请注意,此解决方案将逐行搜索结果,因此它不会对大型结果集有效。