Anda dapat menggunakan row_number()
dua kali:
select *
from (
select *
, row_number() over (partition by OT order by OI desc) as rn2
from (
select *
, row_number() over (partition by EI, BI, OT
order by created_at desc) as rn1
from Odds
where EI = 1 -- for event 1
) sub1
where rn1 = 1 -- Latest row per EI, BI, OT
) sub2
where rn2 = 1 -- Highest OI per OT
Tetapi jika tabel terus bertambah, ini akan berkinerja buruk. Anda dapat menambahkan tabel riwayat seperti OddsHistory, dan memindahkan Odds yang sudah usang ke sana. Ketika hanya Odds terbaru yang ada di tabel Odds, kueri Anda menjadi lebih sederhana.
Contoh langsung di SQL Fiddle.