Det, du har brug for, er en "spring over scanning" eller "scanning af løs indeks ". PostgreSQL's planlægger implementerer endnu ikke disse automatisk, men du kan narre den til at bruge en ved at bruge en rekursiv forespørgsel.
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;
Der kan være en måde at kollapse max(eventtime) i den rekursive forespørgsel i stedet for at gøre det uden for den forespørgsel, men hvis det er tilfældet, har jeg ikke ramt det.
Dette kræver et indeks på (eventtype, eventtime) for at være effektiv. Du kan få det til at være DESC på eventtidspunktet, men det er ikke nødvendigt. Dette er effektivt kun, hvis eventtype kun har nogle få forskellige værdier (21 af dem, i dit tilfælde).