我有以下查询,可查询到传入的特定坐标最近的城市/城镇。它将最多返回5条记录,而我只想对城市和州做一个不同的记录。在数据库中,如果城市很大,我会重复一些城市,因此我想对此做一个独特的分析,并返回一组独特的城市和州。另外,例如芝加哥等一些城市,我在数据库中有4次不同时间,但是纬度和经度略有不同,这就是为什么我必须从不同的查询中排除纬度和经度的原因。 。当我运行此查询时,出现以下错误
SELECT distinct on(city::text || ', ' || state::text), latitudes, longitudes
FROM zips
ORDER BY ABS(28.458414 - latitudes) + ABS(-81.395258-longitudes)
limit 5
错误:SELECT DISTINCT ON表达式必须与初始ORDER BY匹配 表达式LINE 1:选择与on(city :: text ||','|| 状态::文字)纬度...
我也看过,但似乎无法使它工作
Sql SELECT DISTINCT - How can I select distinct couple without considering columns' order? 但似乎无法正常工作
答案 0 :(得分:4)
与错误完全相同。您的ORDER BY
列最初必须与DISTINCT ON
列匹配,然后您可以在此之后订购其他任何东西。所以:
SELECT distinct on(city::text || ', ' || state::text) latitudes, longitudes
FROM zips
ORDER BY city::text || ', ' || state::text, ABS(28.458414 - latitudes) + ABS(-81.395258-longitudes)
limit 5
尽管在DISTINCT ON
中,我不明白为什么要连接这些字段,它似乎没有任何作用,因为它像分别指定列一样“独特”,即更有表现力。所以:
SELECT distinct on(city, state) latitudes, longitudes
FROM zips
ORDER BY city, state, ABS(28.458414 - latitudes) + ABS(-81.395258-longitudes)
limit 5
请记住,在DISTINCT ON
中指定列不会返回这些列,因此您的查询当前只会返回latitudes, longitudes
,而没有任何城市或州信息。
答案 1 :(得分:1)
Error
很清楚。如果您首先尝试查找语法,则应该查看Postgresql
的文档。因为信息非常详细。。Documentation
和我认为引用文档:
除非使用ORDER BY,否则每个集合的“第一行”都是不可预测的 确保所需的行首先出现
您需要在ORDER BY
中使用DISTINCT ON
列。 @ 404 answer很棒。.