Postgres prend en charge les fonctions de fenêtre qui conviennent à cette 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
Pour chaque combinaison de date , symbol , cette requête renvoie la value et created_time de la ligne avec le plus élevé (c'est-à-dire dernier ) created_time de cette date et symbol .
Je suggérerais cet index :
CREATE UNIQUE INDEX test_table_idx
ON test_table (date, symbol, created_time, value)
C'est une couverture index (a toutes les valeurs dont vous avez besoin pour la requête, évitant le besoin d'accéder à la table réelle, et que vous aviez déjà), mais notez que created_time vient avant value , donc les données sont déjà dans leur ordre de partition, et value est l'attribut le moins important, car il ne participe à aucune détermination de la ligne à renvoyer.