Postgres understøtter vinduefunktioner der passer til denne situation:
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
For hver kombination af date
, symbol
, returnerer denne forespørgsel value
og created_time
fra rækken med den højeste (dvs. sidste ) created_time
af denne date
og symbol
.
Jeg vil foreslå dette indeks:
CREATE UNIQUE INDEX test_table_idx
ON test_table (date, symbol, created_time, value)
Det er et betræk indeks (har alle de værdier, du har brug for til forespørgslen, hvilket undgår behovet for at få adgang til den faktiske tabel, og som du allerede havde), men bemærk, at created_time
kommer før value
, så data er allerede i deres partitionsrækkefølge og value
er den mindst vigtige egenskab, fordi den ikke deltager i nogen bestemmelse af, hvilken række der skal returneres.