Postgres 10 SQL如何在没有所有列的情况下进行区分

时间:2018-12-04 19:57:25

标签: sql postgresql

我有以下查询,可查询到传入的特定坐标最近的城市/城镇。它将最多返回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? 但似乎无法正常工作

2 个答案:

答案 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很棒。.