2013-03-01 2 views
1

c'est assez difficile à décrire, mais j'ai une table postgresql 9.1 (planet_osm_roads). Ma requête estcomment rendre le résultat postgresql unique

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 

Le résultat est

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) 

Je veux un résultat qui contient 3 lignes (un pour chaque md5) et toute des autres lignes correspondantes. Donc une ligne valide pour "ae945148417ada285130c59277c48a25" peut contenir osm_id-autoroute paire de "-1641383" & "autoroute" ou "23133731" & "highway_link" - Je ne me dérange pas et considérera les deux comme corrects.

Comment puis-je résoudre ce problème et comment l'opération/technique requise est-elle appelée? Donc, je sais pour la prochaine fois comment l'appeler un quoi chercher.

+0

Groupez par Md5 à la fin (avant le ORDER BY), et utilisez les valeurs min() ou (max) que vous préférez sur les autres colonnes. –

+0

Merci. Je savais que j'étais proche. – dompie

Répondre

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 pour reconnaître que le 'in' est inutile. –

+0

Vos solutions s'exécutent plus rapidement et produisent le même résultat (pour mon scénario). Merci! – dompie

Questions connexes