获取停止(行x)和开始(行x + 1)之间的时间间隔

时间:2016-04-16 23:05:06

标签: sql postgresql intervals postgresql-9.5 sql-timestamp

我在PostgreSQL 9.5中有一个表,每行有{strong>两个时间戳,timestampstarttimestampstop

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

现在我不想计算开始和停止之间的间隔,但是在停止和下一次开始之间。所以我想要第x行的TIMESTAMPSTOP和第x + 1行的TIMESTAMPSTART之间的间隔。顺便说一句,ID不是按时间顺序排列的!

2 个答案:

答案 0 :(得分:1)

不能只使用简单的window function lead() or lag(),因为你想要两个不同列之间的间隔

可以使用添加谓词的各种连接变体。带索引 next()timestampstart的{​​{1}}加入可能是最快的。

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

UNIQUE

答案 1 :(得分:1)

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

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

SQLFiddle

此解决方案比Erwin's solutionhttp://www.sqlfiddle.com/#!15/551e2/4

快一个数量级