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.