Для простоты я просто взял целочисленные значения и их различия вместо расстояния между точками (но оно должно быть точно таким же: просто измените вычитание на функцию st_distance
):
demo: db <> fiddle
SELECT DISTINCT ON (v1.point)
v1.point,
v2.point,
abs(v1.point - v2.point)
FROM
table1 v1
CROSS JOIN table2 v2
ORDER BY v1.point, abs(v1.point - v2.point)
Мои таблицы:
table1.point: 1, 2, 4, 8, 16
table2.point: 2, 3, 5, 7, 11, 13
Результат:
| point | point | abs |
|-------|-------|-----|
| 1 | 2 | 1 |
| 2 | 2 | 0 |
| 4 | 3 | 1 |
| 8 | 7 | 1 |
| 16 | 13 | 3 |
Объяснение:
Вы должны вычислить все различия, чтобы узнать, какая из них наименьшая.Это причина для CROSS JOIN
.Теперь вы можете ORDER BY
точки таблицы1 и различия (или расстояния).Обратите внимание на функцию abs()
: она делает все отрицательные значения положительными.В противном случае будет взята разница -42
вместо +1
.
DISTINCT ON (v1.point)
принимает первую упорядоченную строку для каждой точки v1.point.
Примечание:
Из-за CROSS JOIN
и тяжелой математики в st_distance
это может быть очень медленным для огромных наборов данных!