PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Za dużo zamówień według maks. podzapytań dla mojego intelektu

Możesz użyć row_number() dwa razy:

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

Ale jeśli stół będzie rósł, będzie to źle działać. Możesz dodać tabelę historii, taką jak OddsHistory, i przenieść tam nieaktualne kursy. Gdy w tabeli Kursy znajdują się tylko najnowsze kursy, zapytanie staje się znacznie prostsze.

Przykład na żywo w SQL Fiddle.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgres. Przekroczono limit głębokości stosu plpgsql

  2. Wyświetl wszystkie tabele w postgresql information_schema

  3. pobieranie daty ze znacznika czasu w PostgreSQL

  4. Indeks `gin_trgm_ops` Postgresa nie jest używany

  5. Połączenie zewnętrzne 3 lub więcej stołów w Laravel 8