Postgres obsługuje funkcje okien które pasują do tej sytuacji:
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
Dla każdej kombinacji date , symbol , to zapytanie zwraca value i created_time z rzędu z najwyższym (tj. ostatni ) created_time tej date i symbol .
Sugerowałbym ten indeks:
CREATE UNIQUE INDEX test_table_idx
ON test_table (date, symbol, created_time, value)
To przykrycie index (posiada wszystkie wartości potrzebne do zapytania, eliminując potrzebę dostępu do rzeczywistej tabeli, a które już posiadałeś), ale zauważ, że created_time przychodzi przed value , więc dane są już w kolejności partycji, a value jest najmniej ważnym atrybutem, ponieważ nie bierze udziału w żadnym określaniu, który wiersz ma zostać zwrócony.