PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Renvoie les lignes qui sont au maximum d'une colonne dans Postgresql

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.