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.