Postgresql trích xuất hàng cuối cùng cho mỗi id


81

Giả sử tôi có dữ liệu tiếp theo

  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 id trích xuất 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ý điều đó?

Câu trả lời:


156

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

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

Nếu bạn muốn một giải pháp hoạt động trên các cơ sở dữ liệu (nhưng kém hiệu quả hơn), bạn có thể sử dụng 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;

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


4
ủng hộ! nó cần một chỉ mục vào ngày mô tả, tuy nhiên, tôi luôn giả định rằng các chỉ mục có thể tìm kiếm được theo cả hai hướng, chỉ mục khóa chính mặc định tăng dần vào ngày sẽ hoạt động tốt cho một trường giảm dần trên cùng một trường, trong trường hợp của tôi, tôi có các khóa tổng hợp (id, date) phím tổng hợp gây ra sự cố?
PirateApp

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

Đã thử nghiệm trong PostgreSQL, MySQL


-5

Nhóm theo id và sử dụng bất kỳ hàm tổng hợp nào để đáp ứng các 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

4
một lần nữa, điều này sẽ không cung cấp đầu ra thực tế
Vivek S.

Tôi còn thiếu gì ở đây?
Amal Ts

Bạn đang phân biệt các nhóm dựa trên another_info, vì vậy điều này sẽ không chỉ nhóm theo id. Và nếu thay vào đó, bạn sử dụng một hàm tổng hợp trên another_info, để có được nhóm chính xác, thì hàm tổng hợp (giả sử max ()), sẽ không trả về giá trị another_info cho hàng có giá trị max (ngày). Thật vậy, hai quan sát này là lý do mà ngay từ đầu đây là một câu hỏi.
gwideman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.