Postgres stöder fönsterfunktioner som passar den här situationen:
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
För varje kombination av date , symbol , returnerar den här frågan value och created_time från raden med högst (dvs. sista ) created_time av det date och symbol .
Jag skulle föreslå detta index:
CREATE UNIQUE INDEX test_table_idx
ON test_table (date, symbol, created_time, value)
Det är en täckning index (har alla värden du behöver för frågan, vilket undviker behovet av att komma åt den faktiska tabellen, och som du redan hade), men notera att created_time kommer före value , så data är redan i sin partitionsordning och value är det minst viktiga attributet, eftersom det inte deltar i någon bestämning av vilken rad som ska returneras.