Postgres podporuje funkce oken které vyhovují této situaci:
select date, symbol, value, created_time
from (select *,
rank() over (partition by date, symbol order by created_time desc) as rownum
from test_table) x
where rownum = 1
Pro každou kombinaci date
, symbol
, tento dotaz vrátí value
a created_time
z řádku s nejvyšší (tj. poslední ) created_time
tohoto date
a symbol
.
Navrhoval bych tento index:
CREATE UNIQUE INDEX test_table_idx
ON test_table (date, symbol, created_time, value)
Je to krytí index (má všechny hodnoty, které potřebujete pro dotaz, čímž se vyhnete nutnosti přístupu ke skutečné tabulce a které jste již měli), ale všimněte si, že created_time
přichází před value
, takže data jsou již v pořadí oddílů a value
je nejméně důležitý atribut, protože se nepodílí na žádném určování, který řádek má být vrácen.