2013-03-01 29 views
1

這在某種程度上很難描述,但是我有一個postgresql 9.1表(planet_osm_roads)。 我的查詢是如何使postgresql的結果唯一

SELECT 
    osm_id, name, highway, way, md5(astext(way)) AS md5 
FROM planet_osm_roads 
WHERE highway IS NOT NULL 
AND md5(astext(way)) IN (
    SELECT DISTINCT md5(astext(way)) 
    FROM planet_osm_roads 
    WHERE highway IS NOT NULL 
    GROUP BY md5 
    HAVING count(osm_id) > 1 
) 
ORDER BY osm_id 

結果是

osm_id | name | highway |  ...way ... |    md5     
----------+------+---------------+-------...----...--+---------------------------------- 
-1641383 |  | motorway  | 010200...CA96...0 | 04b4336b997e7ea9d99208bd487bbe7d 
-1641383 |  | motorway  | 010200...EC3E...0 | ae945148417ada285130c59277c48a25 
-1641383 |  | motorway  | 010200...7BF6...0 | 5c5a1b8ae40c1b7f24e293a012ad2add 
23133731 |  | motorway_link | 010200...EC3E...0 | ae945148417ada285130c59277c48a25 
31309105 |  | motorway  | 010200...7BF6...0 | 5c5a1b8ae40c1b7f24e293a012ad2add 
49339926 |  | motorway  | 010200...CA96...0 | 04b4336b997e7ea9d99208bd487bbe7d 
(6 rows) 

我想保存3行的結果(一個用於每MD5哈希值)和其他相應的行中的任何。 因此,「ae945148417ada285130c59277c48a25」的有效行可能包含「-1641383」&「高速公路」或「23133731」&「motorway_link」的osm_id-highway對 - 我不介意並將兩者都視爲正確。

我該如何解決這個問題,以及如何調用所需的操作/技巧?所以我知道下一次如何稱它爲搜索。在末(ORDER BY之前)

+0

集團通過MD5和使用你喜歡的其他列無論MIN()或(最大值)。 – 2013-03-01 11:34:29

+0

謝謝。我知道我很親密。 – dompie 2013-03-01 14:31:30

回答

2
select 
    md5(astext(way)) as md5, 
    min(osm_id) osm_id, 
    min(name) name, 
    min(highway) highway, 
    min(way) way 
from planet_osm_roads 
where highway is not null 
group by 1 
having count(osm_id) > 1 
+0

+1表示認識到'in'是不必要的。 – 2013-03-01 14:27:32

+0

您的解決方案運行得更快,併產生相同的結果(針對我的方案)。謝謝! – dompie 2013-03-01 17:14:07