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.