#sql #postgresql #spatial
Вопрос:
Рассмотрим таблицы nyc_streets
и nyc_subway_stations
со столбцами name
nad geom
. Для трех определенных улиц я хочу найти 10 ближайших ST_Distance
функциональных станций метро. Я попытался начать с этого, но потерпел неудачу:
SELECT street.name, subway.name
FROM nyc_streets AS street INNER JOIN nyc_subway_stations AS subway
HAVING ST_Distance(street.geom, subway.geom) == min(ST_Distance(street.geom, subway.geom))
AND street.name in ('Elder Ave', 'Castle Hill Ave', '4th Ave')
GROUP BY street.name, subway.name ORDER BY subway.name;
Как подойти к этой проблеме?
Комментарии:
1. Нет ВЫБОРА ? Полный текст запроса, пожалуйста.
2. @Serg ошибка форматирования, извините, исправлена
Ответ №1:
Заказывайте по расстоянию с помощью a row_number()
, выберите топ-10. Предполагая id
, что PK из street
SELECT street_name, subway_name
FROM (
SELECT street.name street_name, subway.name subway_name
, row_number() over(partition by street.id order by ST_Distance(street.geom, subway.geom)) rn
FROM nyc_streets AS street
CROSS JOIN nyc_subway_stations AS subway
WHERE street.name in ('Elder Ave', 'Castle Hill Ave', '4th Ave')
) t
WHERE rn <= 10
Комментарии:
1. Это работает, но возвращает более 10 станций-есть идеи по исправлению?