不确定我的设计是否足以解决随着时间推移的总线路由问题。这是我的解决方案,其中包含以下主要步骤:
第1步)有一个表示所有边的边表(源和目标代表顶点(公交车站):
postgres=# select id, source, target, cost from busedges;
id | source | target | cost
----+--------+--------+------
1 | 1 | 2 | 1
2 | 2 | 3 | 1
3 | 3 | 4 | 1
4 | 4 | 5 | 1
5 | 1 | 7 | 1
6 | 7 | 8 | 1
7 | 1 | 6 | 1
8 | 6 | 8 | 1
9 | 9 | 10 | 1
10 | 10 | 11 | 1
11 | 11 | 12 | 1
12 | 12 | 13 | 1
13 | 9 | 15 | 1
14 | 15 | 16 | 1
15 | 9 | 14 | 1
16 | 14 | 16 | 1
第2步)有一张表,该表代表公交车的详细信息,例如时间,时间,边沿等。
注意:我使用整数格式用于“从”和“至”列以获得更快的结果,因为我可以进行整数查询,但是可以将其替换为任何更好的格式。
postgres=# select id, "busedgeId", "busId", "from", "to" from busedgetimes;
id | busedgeId | busId | from | to
----+-----------+-------+-------+-------
18 | 1 | 1 | 33000 | 33300
19 | 2 | 1 | 33300 | 33600
20 | 3 | 2 | 33900 | 34200
21 | 4 | 2 | 34200 | 34800
22 | 1 | 3 | 36000 | 36300
23 | 2 | 3 | 36600 | 37200
24 | 3 | 4 | 38400 | 38700
25 | 4 | 4 | 38700 | 39540
第3步)使用dijkstra算法找到最近的路径。
第4步)以最早的顺序从busedgetimes表中获取即将到来的公交车,这是dijkstra算法检测到的最近路径。
问题:我发现很难查询第4步。
例如:如果我得到路径为边2、3、4,则从上面记录中的源顶点2到目标顶点5进行移动。要获得第一条总线的第一条边缘,并不难,我可以简单地用from < 'expected departure' order by from desc
进行查询,但是对于第二条边缘,from
条件需要to
条第一条结果行的时间。此外,查询还需要边缘ID过滤器。
如何在单个查询中实现?另外,请建议我是否有更好的设计?
谢谢
答案 0 :(得分:1)
我不确定我是否正确理解了您的问题。但是可以通过窗口函数(https://www.postgresql.org/docs/current/static/tutorial-window.html):
从其他行获取值:SELECT
id,
lag("to") OVER (ORDER BY id) as prev_to,
"from",
"to",
lead("from") OVER (ORDER BY id) as next_from
FROM bustimes;
lag
函数将上一行的值移到当前行。 lead
函数与下一行相同。这样您就可以计算出最后一次到达和当前离开之间的差值。
结果:
id prev_to from to next_from
18 33000 33300 33300
19 33300 33300 33600 33900
20 33600 33900 34200 34200
21 34200 34200 34800 36000
22 34800 36000 36300
请注意,“ from”和“ to”是PostgreSQL中的保留字。最好选择其他名称。