Yang Anda butuhkan adalah "lewati pemindaian" atau "pemindaian indeks longgar ". Planner PostgreSQL belum mengimplementasikannya secara otomatis, tetapi Anda dapat mengelabuinya untuk menggunakannya dengan menggunakan kueri rekursif.
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;
Mungkin ada cara untuk menciutkan max(eventtime) ke dalam kueri rekursif daripada melakukannya di luar kueri itu, tetapi jika demikian, saya belum menemukannya.
Ini membutuhkan indeks (eventtype, eventtime) agar efisien. Anda dapat membuatnya menjadi DESC pada waktu acara, tetapi itu tidak perlu. Ini efisien hanya jika eventtype hanya memiliki beberapa nilai yang berbeda (21 di antaranya, dalam kasus Anda).