Я добавлю еще один запрос, потому что это самый быстрый без индексов - он требует только одного последовательного сканирования таблицы. Проще и быстрее, чем запрос @ Florin.
SELECT caseid
FROM tbl
GROUP BY caseid
HAVING max(id) = max(CASE WHEN status = 'published' THEN id ELSE NULL END);
Однако, с правильными индексами @ Решение Элроя намного быстрее . Я действительно провел быстрый тест с похожей реальной таблицей, чтобы убедиться в этом.
Правильные индексы:
CREATE INDEX tbl_id_idx ON tbl (id);
А это частичный индекс для оптимальных результатов:
CREATE INDEX tbl_status_published_idx ON tbl (id) WHERE status = 'published';
Вам не нужны никакие другие индексы для этого запроса. В частности, дополнительный индекс на caseid
не имеет смысла. Всегда учитывайте, что поддержание индекса также сопряжено с затратами, особенно если в таблице много написано.
Это, вероятно, изменится при покрытии индексов («сканирование только по индексу») в PostgreSQL 9.2. Я написал подробнее об этом в недавнем ответе на dba.SE .
Попробуйте ОБЪЯСНИТЬ АНАЛИЗ , чтобы проверить.