2015-01-22 22 views
12

Giả sử tôi đã dữ liệu tiếp theoPostgreSQL trích xuất hàng cuối cùng cho mỗi id

id date   another_info 
    1  2014-02-01   kjkj 
    1  2014-03-11   ajskj 
    1  2014-05-13   kgfd 
    2  2014-02-01   SADA 
    3  2014-02-01   sfdg 
    3  2014-06-12   fdsA 

Tôi muốn cho mỗi trích id thông tin cuối cùng:

id date   another_info 
    1  2014-05-13   kgfd 
    2  2014-02-01   SADA 
    3  2014-06-12   fdsA 

Làm thế nào tôi có thể quản lý đó?

Trả lời

19

Cách hiệu quả nhất là sử dụng toán tử distinct on Postgres'

select distinct on (id) id, date, another_info 
from the_table 
order by id, date desc; 

Nếu bạn muốn có một giải pháp mà các công trình trên cơ sở dữ liệu (nhưng là kém hiệu quả), bạn có thể sử dụng một hàm cửa sổ:

select id, date, another_info 
from (
    select id, date, another_info, 
     row_number() over (partition by id order by date desc) as rn 
    from the_table 
) t 
where rn = 1 
order by id; 

Giải pháp với chức năng cửa sổ là trong hầu hết các trường hợp nhanh hơn so với sử dụng truy vấn phụ.

+0

cảm ơn, tôi chỉ cần điều đó !!! –

0

Nhóm theo id và sử dụng bất kỳ hàm tổng hợp nào để đáp ứng tiêu chí của bản ghi cuối cùng. Ví dụ

select id, max(date), another_info 
from the_table 
group by id, another_info 
+3

một lần nữa điều này sẽ không cung cấp cho đầu ra thực tế –

+0

Tôi đang thiếu gì ở đây? –

+0

Bạn đã kiểm tra lựa chọn của mình chưa ??? –

4
select * 
from bar 
where (id,date) in (select id,max(date) from bar group by id) 

Tested trong PostgreSQL, MySQL

Các vấn đề liên quan