Выберите другие атрибуты из минимальных строк в перекрестном соединении - PullRequest
0 голосов
/ 04 октября 2018

Я пишу запрос, который объединяет многие местоположения со списком транзитных станций, чтобы определить минимальное расстояние до остановки общественного транспорта.С запросом довольно просто:

select
  location.id,
  MIN(
    ST_distance_sphere(
      ST_MakePoint(
        transit.latitude,
        transit.longitude
      ),
      ST_MakePoint(
        cast(locations.latitude as double precision),
        cast(locations.longitude as double precision)
      )
    )
  ) as meters_from_nearest_stop,
from public.transit_stops transit
cross join public.locations locations
group by 1

Это, однако, не может наивно дать мне местоположение с минимальным расстоянием, просто минимальным расстоянием.Как я могу изменить это, чтобы вернуть мне другие атрибуты из строки с минимальным расстоянием?

Результирующее перекрестное соединение довольно большое, поэтому производительность важна.

1 Ответ

0 голосов
/ 04 октября 2018

Это делается с помощью функции row_number () следующим образом:

select *, 
    row_number() over (partition by location.id order by meters_from_nearest_stop) as closest
from (
    select
      location.id,
      transit.id,
      ST_distance_sphere(
          ST_MakePoint(
            transit.latitude,
            transit.longitude
          ),
          ST_MakePoint(
            cast(locations.latitude as double precision),
            cast(locations.longitude as double precision)
          )
        )
      as meters_from_nearest_stop,
    from public.transit_stops transit
    cross join public.locations locations
) q
where closest=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...