2015-07-19 5 views
1

Во-первых у меня есть одни и те же имена таблиц, столбцы и данные в обеих базах данных (MySQL и Postgres) запрос, который я использую для MySQL 5.6.24, который работает это следующийКак я могу преобразовать этот запрос MySQL в Postgres 9.4

select *,abs(longitudes - -81.4563009)+abs(latitudes-28.11657) as LowestNum 
from zips group by LowestNum limit 1 

Я в основном пытаюсь получить ближайшее место заданного широты и долготу, когда я ставлю тот же запрос в Postgres 9.4 Я получаю сообщение об ошибке, которое утверждает

ERROR: column "zips.zip" must appear in the GROUP BY clause or be used in an aggregate function 
SQL state: 42803 
Character: 8 

я изменить вещи вокруг и сделать это

select *, abs(longitudes - -81.3952524)+abs(latitudes-28.4583868) as 
LowestNum from zips group by LowestNum,zips.zip limit 1 

и я получаю эту ошибку

ERROR: column "zips.ziptype" must appear in the GROUP BY clause or be used in an aggregate function 
SQL state: 42803 
Character: 8 

Я новичок в Postgres, но смотрел на документации и поиска вокруг и ничего не работает какие-либо предложения.

+2

Вы хотите наименьшее число (lowerNum) по почтовому индексу? –

+0

Я хочу, чтобы lowerNum по широте и долготе в последнем запросе ставил zips.zip, потому что эта ошибка появилась для этого столбца. – user1591668

+0

Вам понадобится 'min (LowestNum)' или 'order by LowestNum limit 1', чтобы сообщить PostgreSQL, что вы хотите получить самое низкое значение. Кроме того, вы должны взглянуть на тутораль, который охватывает совокупные функции, такие как 'min' в PostgreSQL: http://www.postgresql.org/docs/9.3/static/tutorial-agg.html – hagello

ответ

2

Что об этом:

select *, abs(longitudes - -81.4563009)+abs(latitudes-28.11657) as LowestNum 
from zips 
order by LowestNum ascending 
limit 1 

К сожалению, у меня нет PostgreSQL экземпляра, чтобы проверить его.

order by [..] ascending/descending limit 1 является распространенным способом избежать min и max и трудности, с которыми они влекут за собой, когда у вас есть более одного результата столбец (group by, соединяющую).

+0

Спасибо большое, что отлично работало. – user1591668

+0

Историческое примечание. В версиях PostgreSQL <= 8.? Код для обработки агрегатных функций, таких как 'min' или' max', был несколько тупым. Вам действительно нужно было использовать 'order by ... limit 1', чтобы использовать индексы. – hagello

+0

Другими возможными решениями являются использование 'distinct on()', если ожидается более одной строки или когда ANSI SQL требуется функция окна –

Смежные вопросы