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

Postgres Slow grouper par requête avec max

Ce dont vous avez besoin est un "saut d'analyse" ou "analyse d'index lâche ". Le planificateur de PostgreSQL ne les implémente pas encore automatiquement, mais vous pouvez l'amener à en utiliser un en utilisant une requête récursive.

WITH RECURSIVE  t AS (
SELECT min(eventtype) AS eventtype FROM allevents
           UNION ALL
SELECT (SELECT min(eventtype) as eventtype FROM allevents WHERE eventtype > t.eventtype)
   FROM t where t.eventtype is not null
)
select eventtype, (select max(eventtime) from allevents where eventtype=t.eventtype) from t;

Il peut y avoir un moyen de réduire le max(eventtime) dans la requête récursive plutôt que de le faire en dehors de cette requête, mais si c'est le cas, je ne l'ai pas trouvé.

Cela nécessite un index sur (eventtype, eventtime) pour être efficace. Vous pouvez l'avoir DESC sur l'heure de l'événement, mais ce n'est pas nécessaire. Ceci n'est efficace que si eventtype n'a que quelques valeurs distinctes (21 d'entre elles, dans votre cas).