【问题标题】:Filtering time series data based on previous result row values in PostgreSQL根据 PostgreSQL 中先前的结果行值过滤时间序列数据
【发布时间】:2015-01-20 14:57:38
【问题描述】:

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

如果配置的间隔是 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 以一种有效的方式完成。

【问题讨论】:

    标签: postgresql postgresql-9.3


    【解决方案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

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

    【讨论】:

    • 正是我想要的。我将运行一些基准测试,看看这是否适合我的需求。
    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 2021-12-29
    • 2021-08-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    相关资源
    最近更新 更多