Postgres ondersteunt vensterfuncties die bij deze situatie passen:
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
Voor elke combinatie van date
, symbol
, deze zoekopdracht retourneert de value
en created_time
uit de rij met de hoogste (dwz laatste ) created_time
van die date
en symbol
.
Ik zou deze index aanraden:
CREATE UNIQUE INDEX test_table_idx
ON test_table (date, symbol, created_time, value)
Het is een bedekkende index (heeft alle waarden die u nodig heeft voor de query, waardoor u geen toegang hoeft te krijgen tot de eigenlijke tabel en die u al had), maar houd er rekening mee dat created_time
komt voor value
, dus de gegevens staan al in de partitievolgorde, en value
is het minst belangrijke kenmerk, omdat het niet deelneemt aan de bepaling van welke rij moet worden geretourneerd.