Минимальное значение SQL для таблиц объединения

#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 станций-есть идеи по исправлению?