基于SQL匹配不同行首尾坐标生成路径序列的技术咨询
构建路网路径序列(Seq)的SQL解决方案
我来帮你搞定这个生成路径序列的问题!从你的示例数据和期望结果来看,核心需求是针对每个相同Route和Direction的路段组,按照路段的连接顺序(前一段的终点=后一段的起点)生成连续的Seq编号,每个组的Seq从1开始递增。
你之前的查询只是做了路段间的关联,但没处理序列编号,这里推荐用**递归CTE(Common Table Expression)**来实现,这是处理这类路径遍历问题最清晰的方式,适合MySQL 8.0+、PostgreSQL、SQL Server等支持递归CTE的数据库。
完整SQL代码
WITH RECURSIVE road_network AS ( -- 锚点成员:找出每个Route+Direction组的起始路段(没有前驱路段的) SELECT ID, Route, Direction, SLAT, SLON, ELAT, ELON, 1 AS Seq FROM myTable t WHERE NOT EXISTS ( SELECT 1 FROM myTable t2 WHERE t2.Route = t.Route AND t2.Direction = t.Direction AND t2.ELAT = t.SLAT AND t2.ELON = t.SLON ) UNION ALL -- 递归成员:遍历后续连接的路段,递增加Seq SELECT t.ID, t.Route, t.Direction, t.SLAT, t.SLON, t.ELAT, t.ELON, rn.Seq + 1 AS Seq FROM myTable t JOIN road_network rn ON t.Route = rn.Route AND t.Direction = rn.Direction AND t.SLAT = rn.ELAT AND t.SLON = rn.ELON ) -- 输出结果并按组和序列排序 SELECT ID, Route, Direction, SLAT, SLON, ELAT, ELON, Seq FROM road_network ORDER BY Route, Direction, Seq;
代码解释
- 锚点成员部分:负责找到每个Route+Direction组的起始路段——也就是没有任何同组路段的终点和它的起点匹配的路段,把这些路段的Seq设为1(比如示例中RT-3 E的ID1、RT-9 E的ID7)。
- 递归成员部分:把已经找到的路段(
road_network临时表)和原表关联,找到以该路段终点为起点的同组路段,将新路段的Seq设为上一段的Seq+1,以此类推遍历整个路径链。 - 最终查询:把所有路段的结果按Route、Direction、Seq排序,就能得到和你示例完全一致的路径序列。
这个方案会自动处理每个Route+Direction组的独立路径序列,不管每个组有多少个路段,都能正确生成连续的Seq编号。
内容的提问来源于stack exchange,提问作者Brijesh
相关产品推荐
相关产品推荐

