必要なのは「スキップスキャン」または「
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;
max(eventtime)をそのクエリの外部で実行するのではなく、再帰クエリに折りたたむ方法があるかもしれませんが、そうであれば、私はそれをヒットしていません。
これを効率的にするには、(eventtype、eventtime)のインデックスが必要です。イベント時にDESCにすることもできますが、必須ではありません。これは、eventtypeにいくつかの異なる値(あなたの場合は21個)しかない場合にのみ効率的です。