1

我在 PostgreSQL 9.5 中有一个表,每行有两个时间戳timestampstart并且timestampstop.

CREATE TABLE routes(
    ID serial PRIMARY KEY,
    TIMESTAMPSTART timestamp default NULL,
    TIMESTAMPEND timestamp default NULL
);

现在我不想计算 start 和 stop 之间的间隔,而是stop 和 next start之间的间隔。TIMESTAMPSTOP所以我想要从第 xTIMESTAMPSTART行到第 x+1 行之间的间隔。顺便说一句,这ID不是按时间顺序排列的!

4

2 回答 2

1

不能只使用简单的窗口函数lead(),也不能根据需要使用两个lag()不同列之间的间隔。

添加谓词的各种连接变体是可能的。在连接上timestampstart使用索引 可能是最快的。LATERALLIMIT 1

假设timestampstartUNIQUE,否则您需要定义如何打破关系。UNIQUE约束还将提供性能所需的索引:

SELECT r.*, r1.timestampstart - r.timestampend AS interval_til_start_of_next_row
FROM   routes r
LEFT   JOIN LATERAL (
   SELECT timestampstart
   FROM   routes
   WHERE  timestampstart > r.timestampend
   ORDER  BY timestampstart  -- or BY timestampstart, id - to break ties if not unique
   LIMIT  1
   ) r1 ON true;
于 2016-04-17T00:53:52.317 回答
1

如果“事件”之间没有重叠,那么你可以做一个简单的窗口功能。查询可以很简单:

SELECT id, lead(timestampstart) OVER (ORDER BY timestampstart) -
           timestampend AS timetonext
FROM routes;

SQLFiddle

该解决方案比Erwin 的解决方案快一个数量级:http ://www.sqlfiddle.com/#!15/551e2/4

于 2016-04-17T11:04:17.560 回答