Những gì bạn cần là "quét bỏ qua" hoặc " quét chỉ mục lỏng lẻo ". Trình lập kế hoạch của PostgreSQL chưa tự động triển khai những thứ đó, nhưng bạn có thể lừa nó sử dụng nó bằng cách sử dụng truy vấn đệ quy.
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;
Có thể có một cách để thu gọn tối đa (thời gian sự kiện) vào truy vấn đệ quy thay vì thực hiện nó bên ngoài truy vấn đó, nhưng nếu vậy, tôi đã không sử dụng nó.
Điều này cần một chỉ mục trên (loại sự kiện, thời gian sự kiện) để hoạt động hiệu quả. Bạn có thể đặt nó là DESC vào thời gian diễn ra sự kiện, nhưng điều đó là không cần thiết. Điều này chỉ hiệu quả nếu loại sự kiện chỉ có một vài giá trị riêng biệt (21 trong số đó, trong trường hợp của bạn).