Самый эффективный способ - это сделать все в одном агрегированном запросе (подзапросы и аналитические функции не требуются).
select id
, min(state) keep (dense_rank last order by dt) as state
, max(dt) as dt
from <your_table>
group by id
order by id -- if needed
;
Ключевые слова Oracle, такие как date
, не должны использоваться в качестве имен столбцов.,Я изменил это на dt
.