Вы можете попробовать оконные функции:
select t.*
from (select t.*,
row_number() over (partition by categoryColumn order by id desc) as seqnum
from mytable t
) t
where seqnum = 1;
Я бы порекомендовал индекс для (categoryColumn, id desc)
.
С этим индексом вы можете обнаружить, что коррелированный подзапрос работает быстрее:
select t.*
from mytable t
where t.id = (select max(t2.id)
from mytable t2
where t2.categoryColumn = t.categoryColumn
);
Хотя я думаю, что вышеупомянутое быстрее, у меня была хорошая производительность при использовании keep
.Синтаксис более громоздкий:
select categoryColumn, max(id) as id,
max(col1) keep (dense_rank first order by id desc) as col1,
max(col2) keep (dense_rank first order by id desc) as col2,
. . . -- and so on for each column
from mytable t
group by categoryColumn;