PostgreSQL hanno molto bello sintassi per questo tipi di query - distinct on:
SELECT DISTINCT ON (espressione [, ...]) mantiene solo la prima fila di ogni serie di righe in cui le espressioni date valgono come uguali. Le espressioni DISTINCT ON vengono interpretate utilizzando le stesse regole di ORDER BY (vedere sopra). Si noti che la "prima riga" di ciascun set è imprevedibile a meno che ORDER BY non venga utilizzato per garantire che venga visualizzata per prima la riga desiderata .
Quindi la query diventa:
select distinct on(g.geo_id)
g.geo_id, gs.shape_type
from schema.geo g
join schema.geo_shape gs on (g.geo_id=gs.geo_id)
order by g.geo_id, gs.shape_type asc;
In sintassi generale ANSI-SQL per questo (in ogni RDBMS con le funzioni delle finestre e un'espressione di tabella comune, che potrebbe essere commutato subquery) sarebbe:
with cte as (
select
row_number() over(partition by g.geo_id order by gs.shape_type) as rn,
g.geo_id, gs.shape_type
from schema.geo g
join schema.geo_shape gs on (g.geo_id=gs.geo_id)
)
select
geo_id, shape_type
from cte
where rn = 1
fonte
2013-09-24 16:57:53