Вы можете сделать рейтинг по расстояниям.Поэтому сначала вычислите расстояния, затем примените ранжирование по ним, а затем получите только те, которые имеют наивысший рейтинг:
Можно все сделать в одном запросе с повторным выражением для расстояния, но я обычно люблюразбейте его на шаги, используя with
, например так:
WITH
distances AS (
SELECT
restaurants.*,
towns.*,
SDO_GEOM.SDO_DISTANCE(restaurants.geometry, towns.geometry, 0.005) AS distance
FROM
restaurants CROSS JOIN towns),
distance_ranks AS (
SELECT
distances.*,
DENSE_RANK() OVER(PARTITION BY town_id ORDER BY distance DESC) AS ranking
FROM
distances)
SELECT
*
FROM
distance_ranks
WHERE
ranking = 1;
Я использовал dense_rank
здесь.rank
даст те же результаты (так как вы получите только первый).Это может привести к нескольким результатам на город, если они находятся на одинаковом расстоянии.Если вы не хотите этого, вы можете использовать row_number
и применить дополнительное поле к заказу (например, название ресторана), чтобы получить только одно из двух.