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

Get time interval between stop (row x) and start (row x+1)

我在 PostgreSQL 9.5 中有一个 table,每行有 两个时间戳timestampstarttimestampstop

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

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

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

添加谓词的各种连接变体是可能的。有一个索引 timestampstart LATERAL 加入 LIMIT 1 可能是最快的。

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

  • How does PostgreSQL enforce the UNIQUE constraint / what type of index does it use?

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;

如果"events"之间没有重叠,那么你可以做一个简单的window函数。查询可以很简单:

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

SQLFiddle

这个解决方案比: http://www.sqlfiddle.com/#!15/551e2/4

快一个数量级