2013-09-24 10 views

Odpowiedz

20

PostgreSQL posiada bardzo ładny składnię tego rodzaju pytania - distinct on:

SELECT DISTINCT ON (wyrażenie [...]) utrzymuje tylko pierwszy wiersz każdego zestawu wierszy, gdzie podane wyrażenia są równe. Wyrażenia ODWRÓCENIE są interpretowane zgodnie z tymi samymi zasadami, co w przypadku ORDER BY (patrz wyżej). Zauważ, że "pierwszy rząd" każdego zestawu jest nieprzewidywalny, jeśli nie podano ORDER BY, aby upewnić się, że pożądany wiersz pojawia się jako pierwszy.

Więc zapytanie staje:

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; 

W ogólnej składni ANSI-SQL dla tego (w dowolnej RDBMS z funkcji okna i wspólnego wyrażenia tabeli, które mogą być włączane do podzapytania) byłoby:

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 
Powiązane problemy