PostgreSQL có cú pháp rất đẹp với nhiều loại này truy vấn - distinct on:
SELECT DISTINCT ON (expression [, ...]) giữ chỉ hàng đầu tiên của mỗi bộ hàng nơi các biểu thức đã cho được đánh giá bằng nhau. DISTINCT ON biểu thức được diễn giải bằng cách sử dụng các quy tắc tương tự như đối với ORDER BY (xem ở trên). Lưu ý rằng "hàng đầu tiên" của mỗi bộ là không thể đoán trước trừ khi ORDER BY được sử dụng để đảm bảo rằng hàng mong muốn xuất hiện đầu tiên.
Vì vậy, câu hỏi của bạn trở thành:
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;
Trong cú pháp ANSI-SQL chung này (trong bất kỳ RDBMS với chức năng cửa sổ và biểu thức bảng chung, mà có thể được chuyển sang subquery) sẽ là:
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
Nguồn
2013-09-24 16:57:53