Potrzebujesz „pomiń skanowanie” lub „luźne skanowanie indeksu ". Planner PostgreSQL nie implementuje ich jeszcze automatycznie, ale możesz go oszukać za pomocą zapytania rekurencyjnego.
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;
Może istnieć sposób na zwinięcie max(eventtime) do zapytania rekurencyjnego, zamiast robić to poza tym zapytaniem, ale jeśli tak, nie trafiłem na to.
Wymaga to indeksu (typ zdarzenia, czas zdarzenia), aby działać wydajnie. Możesz mieć DESC w czasie wydarzenia, ale nie jest to konieczne. Jest to skuteczne tylko wtedy, gdy eventtype ma tylko kilka odrębnych wartości (w twoim przypadku 21).