2013-09-24 36 views
10

Đối với truy vấn sau, tôi chỉ cần chọn bản ghi đầu tiên có giá trị shape_type thấp nhất (khoảng từ 1 đến 10). Nếu bạn có bất kỳ kiến ​​thức về cách dễ dàng làm điều này là postgresql, xin vui lòng giúp đỡ. Cảm ơn vì đã dành thời gian cho tôi.PostgreSQL: Chỉ chọn bản ghi đầu tiên cho mỗi id dựa trên thứ tự sắp xếp

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; 

Trả lời

20

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 
Các vấn đề liên quan