Loại yêu cầu này (trong đó bạn cần giá trị tối đa hoặc tối thiểu theo một cột, được nhóm lại bởi một cột khác, nhưng bạn cần tất cả dữ liệu từ hàng tối đa hoặc tối thiểu) khá nhiều hàm phân tích là cho. Tôi đã sử dụng row_number
- nếu có thể có ràng buộc, bạn cần làm rõ nhiệm vụ (xem Nhận xét của tôi dưới câu hỏi của bạn) và tùy thuộc vào chi tiết, một hàm phân tích khác có thể thích hợp hơn - có lẽ là rank()
.
with
my_table ( id, name, ref, dt, frm ) as (
select 10, 'Ant' , 100, date '2017-02-02', 'David' from dual union all
select 10, 'Ant' , 300, date '2016-01-01', 'David' from dual union all
select 2, 'Cat' , 90, date '2017-09-09', 'David' from dual union all
select 2, 'Cat' , 500, date '2016-02-03', 'David' from dual union all
select 3, 'Bird', 150, date '2017-06-28', 'David' from dual
)
-- End of simulated table (for testing purposes only, not part of the solution).
-- SQL query begins BELOW THIS LINE.
select id, name, ref, dt, frm
from (
select id, name, ref, dt, frm,
row_number() over (partition by id order by ref desc, dt desc) as rn
from my_table
)
where rn = 1
order by dt desc
;
ID NAME REF DT FRM
-- ---- --- ---------- -----
3 Bird 150 2017-06-28 David
2 Cat 500 2016-02-03 David
10 Ant 300 2016-01-01 David