Как я могу показать дополнительный столбец, не будучи агрегатной функцией или находясь в выражении group by? - PullRequest
2 голосов
/ 10 декабря 2011

Я использую postgis для вычисления расстояния между каждой точкой 'a' и соответствующей ей точкой типа 'b'.

До сих пор мне удавалось сделать это с помощью этого запроса:

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

Это работает, однако в нем перечисляются только имя точки типа a и расстояние до ее ближайшей точки типа b, в нем не указывается имя ближайшей точки типа b для каждой точки типа, как мне бы хотелосьделать.

Обычно я делаю это, соединяя обе таблицы, но они не связаны между собой и не имеют общих ключей, поэтому я не знаю, как к ним присоединиться.

1 Ответ

1 голос
/ 10 декабря 2011

Метод грубой силы (при условии, что PostGIS поддерживает предложения WITH, и при условии, что у меня правильный синтаксис предложений 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_name и b_name) плюс соответствующее расстояние, используя декартово произведение (что и делает ваш оригинальный запрос до того, как включится GROUP BY). Затем он выбирает два имени и расстояние от объединения этой таблицы с той же таблицей, сгруппированной по a_name и объединенной по a_name и минимальному расстоянию.

Очевидно, что если WITH не поддерживается, вы можете дважды написать предложение WITH и надеяться, что ваш оптимизатор работает хорошо.

...