【问题标题】:one to many relation with text parsing and sorting condition与文本解析和排序条件的一对多关系
【发布时间】: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


【解决方案1】:

(作为评论会很乱)

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

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, ',') polyId, id_b, distance_m from tableB) b on b.polyId = a.id_a
group by id_a;

【讨论】:

  • 非常感谢!这让我更进一步。使用您的行,我构建了一个新表并使用“select by id, min(distance)”和“group_by id”进行了一个新查询,以接收每个对象的一个​​结果(在 table_b 之外,距离最小)多边形表(table_a)。但是有没有办法在一个查询中做到这一点和你的代码?
  • @stew,我不太确定你想要的结果。您说的是“一个”结果,但按某个 id 分组会返回很多。无论如何,我正在编辑以添加它,但请通过采样您所追求的结果来明确说明。
  • 再次抱歉我的错误解释。我只有零碎的sql知识。我在起源问题中发布了预期的结果。问题是:regexp_split_function 导致每个 id_a 不止一个对象,因为结果列表包含所有距离。但是我需要再次将此列表聚合为 id_a 的一种表示形式,但是将 id_b 的最小表示形式作为距离。我发现了很多聚合查询,但不知何故,它们都聚合为一列。距离或id。需要两个聚合级联吗?
  • 第二个不解决你的问题吗? (您可以将内部连接更改为左连接)
  • 完美。这就是我需要的。谢谢你,很抱歉回复晚了。
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多