PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Zu viele Order-by-Max-Unterabfragen für meinen Intellekt

Sie könnten row_number() verwenden zweimal:

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

Aber wenn die Tabelle weiter wächst, wird dies schlecht funktionieren. Sie könnten eine Verlaufstabelle wie OddsHistory hinzufügen und veraltete Quoten dorthin verschieben. Wenn sich nur die neuesten Quoten in der Quotentabelle befinden, wird Ihre Abfrage viel einfacher.

Live-Beispiel bei SQL Fiddle.