2013-09-24 19 views
10

Per la seguente query, è necessario selezionare solo il primo record con il valore di shape_type più basso (intervallo compreso tra 1 e 10). Se hai qualche conoscenza su come fare facilmente questo è postgresql, per favore aiutatemi. Grazie per il tuo tempo.PostgreSQL: selezionare solo il primo record per ID in base all'ordinamento

select g.geo_id, gs.shape_type 
from schema.geo g 
join schema.geo_shape gs on (g.geo_id=gs.geo_id) 
order by gs.shape_type asc; 

risposta

20

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 
Problemi correlati