Du kan använda row_number()
två gånger:
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
Men om tabellen fortsätter att växa kommer detta att fungera dåligt. Du kan lägga till en historiktabell som OddsHistory och flytta föråldrade Odds dit. När endast de senaste oddsen finns i oddstabellen blir din fråga mycket enklare.