Самый простой способ - это коррелированный подзапрос в предложении where
:
select t.*
from t
where t.col2 = (select max(t2.col2) from t t2 where t2.col3 = t.col3);
С индексом (col3, col2)
это, вероятно, самое эффективное решение, но оно может возвращать дубликаты.Чтобы избежать этого, вы можете использовать row_number()
:
select t.*
from (select t.*,
row_number() over (partition by col3 order by col2 desc) as seqnum
from t
) t
where seqnum = 1;
Или, в некоторых случаях, это может иметь лучшую производительность:
select max(col1) keep (dense_rank first order by col2 desc), max(col2), col3
from t
group by col3;