根据当前行和下一行之间的时间差进行过滤

sec*_*ave 4 postgresql window-functions

我有一个具有以下结构的数据库表:

id     | created
-------+---------------
1      | 2018-07-23 00:01:00
2      | 2018-07-23 00:02:00
...
Run Code Online (Sandbox Code Playgroud)

现在我想返回与下一行的时间差大于 10 秒的所有行。

我尝试过使用 Postgres 窗口函数,但无法让它工作,例如

SELECT
  created, 
  created - lag(created, 1) OVER (ORDER BY created) delta
FROM tablename
where created - lag(created, 1)  OVER (ORDER BY created) > interval '10 seconds'
ORDER BY created;
Run Code Online (Sandbox Code Playgroud)

我得到的错误是我不允许在WHERE子句中使用窗口函数。如何做到这一点?

Erw*_*ter 6

考虑查询中的事件顺序SELECT,如下所述:

窗口函数在应用子句 对结果集进行操作。WHERE在子句中使用窗口函数会产生逻辑矛盾WHERE。就像 Mustaccio 所说:使用子查询 - 或 CTE - 来过滤窗口函数的结果。

但也要弄清楚逻辑:

其中与下一行的时间差大于例如10秒。

SELECT *
FROM  (
   SELECT created
        , lead(created) OVER (ORDER BY created) - created AS delta
   FROM   tbl
   ) t
WHERE  delta > interval '10 sec'
ORDER  BY created;
Run Code Online (Sandbox Code Playgroud)