与文本解析和排序条件的一对多关系

问题描述

我正在搜索一个 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_a 扩展为table_b(id_b 和distance_m)中的最佳匹配值。如果没有找到 id_a 的匹配项,则 id_b 和距离的值为 id_a; null; null。如果 table_b 中有多个匹配对象且最小距离完全相同,则可以使用其中任何一个。

解决方法

(评论会很乱)

我不知道你想要得到什么结果,但对于一个简单的结果,你可以这样做:

select *
from tableA a
         left join (
    select regexp_split_to_table(poly_ids,',') polyId,id_b,distance_m from tableB) b on b.polyId = a.id_a;

编辑:获取每个 id_a 的最小值(仅那些具有 distance_m 的):

select id_a,min(b.distance_m)
from tableA a
         inner join (
    select regexp_split_to_table(poly_ids,distance_m from tableB) b on b.polyId = a.id_a
group by id_a;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...