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.