Je zou row_number()
. kunnen gebruiken twee keer:
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
Maar als de tafel blijft groeien, zal dit slecht presteren. Je zou een geschiedenistabel zoals OddsHistory kunnen toevoegen en verouderde Odds daarheen kunnen verplaatsen. Als alleen de nieuwste Odds in de Odds-tabel staan, wordt uw zoekopdracht veel eenvoudiger.
Live voorbeeld bij SQL Fiddle.