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.