Использование SDO_Distance для сортировки по расстоянию между двумя местами - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь найти, какой ресторан находится дальше всего от городской геометрии.Вот код, который я пробовал до сих пор:

SELECT sort(SDO_GEOM.SDO_DISTANCE(restaurants.geometry, towns.geometry, 0.005))
FROM restaurants, towns

Город - особая область, поэтому я хочу найти, какой ресторан находится дальше всего.И затем закажите их, если это возможно

Спасибо!

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете сделать рейтинг по расстояниям.Поэтому сначала вычислите расстояния, затем примените ранжирование по ним, а затем получите только те, которые имеют наивысший рейтинг:

Можно все сделать в одном запросе с повторным выражением для расстояния, но я обычно люблюразбейте его на шаги, используя 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 и применить дополнительное поле к заказу (например, название ресторана), чтобы получить только одно из двух.

...