【发布时间】:2021-05-25 09:21:30
【问题描述】:
我正在搜索一个 sql 查询,以便在两个具有更多条件的表之间建立一个新的 n:1 关系。 Table_A 在名为“id_a”的列中具有固定数量的多边形,它们的唯一 ID (varchar)。 Table_B 存储(更多)这些多边形的相邻点及其到特定目标的距离。 table_B 中的每个点都有一个“poly_ids”列,该列以逗号分隔的文本 ID 存储相邻的多边形,一个名为“id_b”的唯一 ID 和距离属性只是一个值(双精度)。
如何为每个多边形找到一个具有最小距离属性的邻点?
我已经尝试了这个和其他一些方法,但没有任何结果:
CREATE TABLE match AS
(SELECT id_a FROM table_A
(DECLARE my_id (varchar 255) := id_a))
UNION
(SELECT id_b FROM table_B
WHERE poly_ids LIKE '%my_id%'
AND
table_B.distance <= MIN(table_B.distance);
我不知道这是否会找到匹配项,但这是两个表的结构:
多边形表:
id_a;row
DENWLI0540200151;"1"
DENWLI0540201042;"2"
DENWLI0539203285;"3"
DENWLI0540200526;"4"
DENWLI0539200707;"5"
DENWLI0540200150;"6"
DENWLI0540200529;"7"
DENWLI0540211664;"8"
DENWLI0539203286;"9"
DENWLI0539200119;"10"
DENWLI0539202148;"11"
DENWLI0539200482;"12"
DENWLI0540200644;"13"
DENWLI0540202807;"14"
DENWLI0539202146;"15"
DENWLI0539200820;"16"
DENWLI0539200487;"17"
DENWLI0540200386;"18"
DENWLI0539200708;"19"
DENWLI0539200233;"20"
DENWLI0539203289;"21"
DENWLI0539202903;"22"
DENWLI0540200274;"23"
DENWLI0539202902;"24"
DENWLI0539201377;"25"
邻居点表:
Distance_m;id_b;poly_ids
458.381978;"1";"DENWLI0540200151,DENWLI0539202146"
388.181258;"2";DENWLI0539203285
347.828999;"3";"DENWLI0539203285,DENWLI0539200630"
347.828999;"4";DENWLI0539203285
1121.671746;"5";DENWLI0540200526
147.780569;"6";DENWLI0540200526
1212.098782;"7";DENWLI0540200526
534.862435;"8";"DENWLI0540200526,DENWLI0540200300,DENWLI0540201374"
169.452134;"9";"DENWLI0540200526,DENWLI0540200090"
76.982818;"10";"DENWLI0540200526,DENWLI0540202246"
1040.426788;"11";"DENWLI0540200526,DENWLI0540202010"
55.631933;"12";"DENWLI0540200526,DENWLI0540202246"
66.441046;"13";"DENWLI0539200707,DENWLI0539202093,DENWLI0539200581"
192.089280;"14";"DENWLI0539200707,DENWLI0539202121"
330.531804;"15";"DENWLI0539200707,DENWLI0539200767"
337.169176;"16";"DENWLI0540200150,DENWLI0540200538"
729.729942;"17";DENWLI0540200150
136.210113;"18";DENWLI0540200529
498.361421;"19";DENWLI0540200529
428.060984;"20";DENWLI0540200529
170.279163;"21";DENWLI0540200529
结果应该是这样的,id_b 是唯一一个距离最小的匹配对象:
id_a; id_b; Distance_m
DENWLI0540200151; "1"; 458.381978
DENWLI0540201042; null; null
DENWLI0539203285; "2"; 347.828999
DENWLI0540200526; "9"; 169.452134
DENWLI0539200707; "13"; 66.441046
DENWLI0540200150; "16"; 337.169176
DENWLI0540200529; "18"; 136.210113
所以结果列表将与 table_a 一样长。或者:它是用table_b(id_b 和distance_m)中的最佳匹配值扩展的table_a。如果没有找到 id_a 的匹配项,则 id_b 和距离的值为 id_a; null; null。如果 table_b 中有多个匹配对象具有完全相同的最小距离,则可以使用其中任何一个。
【问题讨论】:
-
您可以使用 LATERAL 和函数将这些逗号分隔值转换为表格。请您添加一些示例数据和预期的输出。
-
请edit您的问题(通过点击下面的edit链接)并添加一些示例数据和基于该数据的预期输出为formatted text .请参阅here,了解有关如何创建漂亮的文本表格的一些提示。 (edit 您的问题 - 请不要将代码或其他信息放入 cmets)
-
感谢 Cetin,我为上面的两张桌子拍了两张照片。最后一个包含两列的简单层:id_a 和 id_b 的最佳拟合(所有拟合对象的最小距离)就可以了。
-
请不要张贴图片而是发文字。图片对创建样本没有多大帮助。
-
好的,抱歉。下面是两个简短的 csv 版本:
标签: sql postgresql one-to-many qgis many-to-one