我在PostgreSQL 9.5中有一个表,每行有{strong>两个时间戳,timestampstart
和timestampstop
。
CREATE TABLE routes(
ID serial PRIMARY KEY,
TIMESTAMPSTART timestamp default NULL,
TIMESTAMPEND timestamp default NULL
);
现在我不想计算开始和停止之间的间隔,但是在停止和下一次开始之间。所以我想要第x行的TIMESTAMPSTOP
和第x + 1行的TIMESTAMPSTART
之间的间隔。顺便说一句,ID
不是按时间顺序排列的!
答案 0 :(得分:1)
你不能只使用简单的window function lead()
or lag()
,因为你想要两个不同列之间的间隔。
可以使用添加谓词的各种连接变体。带索引
next()
与timestampstart
的{{1}}加入可能是最快的。
假设LATERAL
为LIMIT 1
,否则您需要定义如何打破关系。 timestampstart
约束也将提供性能所需的索引:
UNIQUE
答案 1 :(得分:1)
如果“事件”之间没有重叠,那么您可以执行一个简单的窗口功能。查询可以简单如下:
SELECT id, lead(timestampstart) OVER (ORDER BY timestampstart) -
timestampend AS timetonext
FROM routes;
此解决方案比Erwin's solution:http://www.sqlfiddle.com/#!15/551e2/4
快一个数量级