Карта 100 × 100: противоположные края соединены. Между координатами
1 и 99 через границу всего 2 единицы.Для каждой точки найдите всех ближайших соседей, исключая саму точку.
WITH points(id, x, y) AS (
VALUES (1, 1, 1), (2, 99, 99), (3, 3, 99)
),
distances AS (
SELECT a.id, b.id AS neighbor,
POWER(LEAST(ABS(a.x-b.x), 100-ABS(a.x-b.x)), 2)
+ POWER(LEAST(ABS(a.y-b.y), 100-ABS(a.y-b.y)), 2) AS d2
FROM points a
JOIN points b ON a.id <> b.id
),
ranked AS (
SELECT *,
DENSE_RANK() OVER (
PARTITION BY id ORDER BY d2
) AS r
FROM distances
)
SELECT id, neighbor, SQRT(d2) AS distance
FROM ranked
WHERE r = 1
ORDER BY id, neighbor;
Ответ:
1 → 2, 3; 2 → 1; 3 → 1. Расстояние во всех случаях √8 ≈ 2,828.Подвох: по каждой оси выбираем минимум между прямым путём и переходом через границу.
DENSE_RANK() сохраняет все равные минимумы, а ранжирование по квадрату расстояния позволяет вычислить корень только при выводе.