【发布时间】:2023-11-28 13:44:01
【问题描述】:
我在一个网络数据集上工作(使用 PostGIS 扩展,但是由于我当前使用 pgrouting 的方法是我发现的唯一一种可以做我想做的事情并且运行起来非常痛苦,我想尝试通过属性来处理它) 如下图:
每个部分(字母)是一个单独的对象,颜色是对象的相关属性。
代表这个的表是这样定义的:
CREATE TABLE lines (gid text, color text, startpoint integer, endpoint integer);
INSERT INTO lines (gid, color, startpoint, endpoint)
VALUES
('A','green', 1, 2),
('B','green', 2, 3),
('C','green', 3, 4),
('D','green', 4, 5),
('E','red', 2, 6),
('F','red', 6, 7),
('G','red', 7, 8),
('H','blue', 3, 9),
('I','blue', 4, 10),
('J','blue', 10, 11);
我想要得到的结果是一个由所有相同颜色的对象相互接触组成的聚合对象。所以这里有 4 个对象:{A,B,C,D}, {E,F,G}, {H} 和 {I,J}。我认为要走的路是使用起点和终点值,因为它们决定了对象的接触方面。
现在我像下面的代码一样,使用JOIN,因此返回对象H(如果我使用与ON条件相同的WHERE子句,则不会返回H,因为它永远不会匹配起点/终点相关性):
SELECT a.gid, b.gid, a.color
FROM lines a
LEFT JOIN lines b ON a.gid > b.gid AND (a.startpoint = b.endpoint OR a.endpoint = b.startpoint) AND a.color = b.color
有了这个结果:
从这里我不知道该怎么做。我在 PostGIS 中使用聚合函数来合并行,所以我想我需要以这种形式获得结果(这样我就可以使用 GROUP BY 运行查询):
有人知道一种方法来做我想做的事吗?
【问题讨论】:
标签: sql postgresql group-by graph-algorithm recursive-query