2013-10-02 2 views
0

Мне нужно получить строку с ближайшим значением, используя два столбца. пример ниже работает для одного столбца, но как насчет двух столбцов?Как выбрать ближайшее значение для двух столбцов?

order by abs(Column_X - myvalue_X) limit 1 

мне нужно что-то вроде этого:

order by abs(Column_X - myvalue_X),abs(Column_Y - myvalue_Y) limit 1 //wrong row 

I'm с помощью Postgres с PostGIS

+0

Нам нужно больше деталей с момента запроса технически должен работать только хорошо. Разве это не вычисление правильной строки? Должна ли быть сумма различий, которые вы заказываете? –

ответ

3

Я не уверен, что с синтаксисом Postgre и то, что вы на самом деле до, но если вы хотите сравнить с 2 поля, как об использовании Euclidean distance

Некоторые вещи, как

order by ((Column_X - myvalue_X)*(Column_X - myvalue_X) + (Column_Y - myvalue_Y)*(Column_Y - myvalue_Y)) limit 1 
+0

Спасибо, это решает мою проблему. – user2566397

+1

Это почти [Евклидово расстояние] (https://en.wikipedia.org/wiki/Euclidean_distance), за исключением заказа 'sqrt()' не требуется (если вам действительно не нужно расстояние). Вы можете удалить повторение в SQL, возведя квадрат в каждую разницу, используя '^ 2'. –

+0

Спасибо. Я использую этот трюк в большой базе данных (800 МБ +) в sqlite. Он выполнялся очень плохо (7 + сек для 1 запроса). Чтобы ускорить работу, вы можете сделать свой набор меньшим: 'WHERE Column_X> myvalue_X - somenumber И Column_X myvalue_Y - somenumber И Column_Y Veda

0

Зависит от того, что вы имеете в виду. Вы хотите, чтобы он стоял рядом, где сумма сумма из двух столбцов ближе всего к сумме тех же двух столбцов в исходной строке? или продукт? в алфавитном порядке?

Предположим, что это сумма. Используйте подзапрос

Select * From Table t1 
    join table t2 
    on t1.colA + t1.colB = 
     (Select Max(colA + colB) 
      From Table 
      Where colA + colB < t1.colA + t1.colB) 

Если человек продукт, то

Select * From Table t1 
    join table t2 
    on t1.colA * t1.colB = 
     (Select Max(colA * colB) 
      From Table 
      Where colA * colB < t1.colA * t1.colB) 
Смежные вопросы