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).