Persyaratan semacam ini (di mana Anda memerlukan maks atau min menurut satu kolom, dikelompokkan oleh yang lain, tetapi Anda memerlukan semua data dari baris maks atau min) kurang lebih seperti apa fungsi analitik adalah untuk. Saya menggunakan row_number
- jika ikatan memungkinkan, Anda perlu mengklarifikasi tugas (lihat Komentar saya di bawah pertanyaan Anda), dan tergantung pada detailnya, fungsi analitik lain mungkin lebih sesuai - mungkin 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