2011-12-10 133 views
2

我使用postgis来计算每个'a'与其对应'b'类型点之间的距离。我如何显示一个额外的列,但它不是一个聚合函数或处于组合语句

到目前为止,我已成功与此查询做到这一点:

SELECT a.name, min(ST_Distance(a.the_geom, b.the_geom)) as distance 
FROM a, b 
GROUP BY a.name; 

这工作,但是,由于它仅列出了一种点的名称和它最接近的B型点的距离,这不是” t按照我的意愿列出最接近的b型点的名称给每个类型点。

我通常会加入这两个表,但他们是不相关的,不共享密钥,所以我不知道如何加入他们。

回答

1

蛮力方法(假设PostGIS的WITH子句支持,并假设我有与条款正确的语法 - 这两个未选中的假设):

WITH (SELECT a.name AS a_name, b.name AS b_name, ST_Distance(a.the_geom, b.the_geom) as distance 
     FROM a, b -- Cartesian product (not efficient!) 
    ) AS distances 
SELECT d1.a_name, d1.b_name, d1.distance 
    FROM distances AS d1 
    JOIN (SELECT a_name, MIN(distance) AS distance 
      FROM distances 
     GROUP BY a_name) AS d2 

这会生成名称列表(a_nameb_name)加上使用笛卡尔积的相应距离(这是您的原始查询在GROUP BY开始前执行的操作)。然后,它选择两个名称以及该表的加入距离与a_name上分组的相同表格的距离,并加入a_name和最小距离。显然,如果不支持WITH,那么可以将WITH子句写出两次,并希望优化器性能良好。

+0

非常感谢您的先生,我没有想过使用WITH。 – user1090729

+0

我的确尝试提出答案,但我还没有足够的“声誉”。 – user1090729

相关问题