PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Muitos pedidos por, max, subconsultas para o meu intelecto


Você pode usar row_number() duas vezes:
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

Mas se a tabela continuar crescendo, isso terá um desempenho ruim. Você pode adicionar uma tabela de histórico como OddsHistory e mover as Odds desatualizadas para lá. Quando apenas as probabilidades mais recentes estão na tabela de probabilidades, sua consulta se torna muito mais simples.

Exemplo ao vivo no SQL Fiddle.