Лучшим методом является коррелированный подзапрос:
select t.*
from t
where t.camp3 = (select max(t2.camp3) from t t2 where t2.camp2 = t.camp2);
В частности, он может использовать индекс на (camp2, camp3)
.
Ваши запросы должны генерировать синтаксические ошибки, потому что они неверно сформированные операторы SQL - использование select *
с group by
обычно не допускается. В частности, все выражения в select
запроса агрегирования должны быть либо выражениями на ключах group by
, либо аргументами для функций агрегирования. index!) в широком диапазоне баз данных, многие люди предпочитают row_number()
вместо:
select t.*
from (select t.*, row_number() over (partition by camp2 order by camp3 desc) as seqnum
from t
) t
where seqnum = 1;
Это также имеет хорошую производительность. А в более современных базах данных с массовым параллелизмом (например, Redshift, BigQuery, PrestoDB) он, вероятно, будет иметь лучшую производительность.