获取停止(第 x 行)和开始(第 x+1 行)之间的时间间隔
Get time interval between stop (row x) and start (row x+1)
我在 PostgreSQL 9.5 中有一个 table,每行有 两个时间戳,timestampstart
和 timestampstop
。
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
可能是最快的。
假设 timestampstart
为 UNIQUE
,否则您需要定义如何打破平局。 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;
快一个数量级
我在 PostgreSQL 9.5 中有一个 table,每行有 两个时间戳,timestampstart
和 timestampstop
。
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
可能是最快的。
假设 timestampstart
为 UNIQUE
,否则您需要定义如何打破平局。 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;
快一个数量级