【发布时间】:2022-01-10 13:33:28
【问题描述】:
假设我们有一个实体元数据的时间序列数据集导入到 postgres 表Stats:
CREATE EXTENSION IF NOT EXISTS POSTGIS;
DROP TABLE IF EXISTS "Stats";
CREATE TABLE IF NOT EXISTS "Stats"
(
"time" BIGINT,
"id" BIGINT,
"position" GEOGRAPHY(PointZ, 4326)
);
这里是表格示例:
SELECT
"id",
"time"
FROM
"Stats"
ORDER BY
"id", "time" ASC
id|time|
--+----+
1| 3|
1| 4|
1| 6|
1| 7|
2| 2|
2| 6|
3| 14|
4| 2|
4| 9|
4| 10|
4| 11|
5| 32|
6| 15|
7| 16|
业务需求是为该表中的实体分配 route-id,所以当每个实体的时间跳过1 second 时,表示该实体的新航班或路线。以前的样本的最终结果是这样的:
id|time|route_id|
--+----+--------+
1| 3| 1|
1| 4| 1|
1| 6| 2|
1| 7| 2|
2| 2| 1|
2| 6| 2|
3| 14| 1|
4| 2| 1|
4| 9| 2|
4| 10| 2|
4| 11| 2|
5| 32| 1|
6| 15| 1|
7| 16| 1|
这将是新的路线汇总表:
id|start_time|end_time|route_id|
--+----------+--------+--------+
1| 3| 4| 1|
1| 6| 7| 2|
2| 2| 2| 1|
2| 6| 6| 2|
3| 14| 14| 1|
4| 2| 2| 1|
4| 9| 11| 2|
5| 32| 32| 1|
6| 15| 15| 1|
7| 16| 16| 1|
那么这个复杂的查询应该如何构造呢?
【问题讨论】:
-
如果我理解正确,对于 ID
4on time10,routeID 必须是2。为什么提供了 3? -
@Arun。是的,没错,它只有两条 ID 为 1、2 的路由
-
差距和岛屿。在这里解决了之前的时间。
-
@shawnt00。实际上这是一个从opensky-network.org/datasets/states 导入的历史飞机航班数据集,应该用路线建模!
-
数据的细节不会改变查询的性质。查找间隙和岛屿,您会发现同一主题的数百种变化。
标签: sql postgresql postgis window-functions