Вы используете Oracle, для этого простого случая не нужно использовать коррелированные подзапросы или самостоятельные объединения. Просто используйте аналитические функции.
with s (col1, col2, col3, col4, col5) as (
select 'A', 1, 'x', 'y', 'y' from dual union all
select 'A', 2, 'x', 'x', 'y' from dual union all
select 'B', 1, 'x', 'y', 'x' from dual)
select*
from
(select s.*, max(col2) over (partition by col1) mx
from s
)
where col2 = mx;
C COL2 C C C MX
- ---------- - - - ----------
A 2 x x y 2
B 1 x y x 1
Elapsed: 00:00:00.00
with s (col1, col2, col3, col4, col5) as (
select 'A', 1, 'x', 'y', 'y' from dual union all
select 'A', 2, 'x', 'x', 'y' from dual union all
select 'B', 1, 'x', 'y', 'x' from dual)
select*
from
(select s.*, row_number() over (partition by col1 order by col2 desc) rn
from s
)
where rn = 1;
C COL2 C C C RN
- ---------- - - - ----------
A 2 x x y 1
B 1 x y x 1
Elapsed: 00:00:00.00
with s (col1, col2, col3, col4, col5) as (
select 'A', 1, 'x', 'y', 'y' from dual union all
select 'A', 2, 'x', 'x', 'y' from dual union all
select 'B', 1, 'x', 'y', 'x' from dual)
select
col1,
max(col2) col2,
max(col3) keep (dense_rank last order by col2) col3,
max(col4) keep (dense_rank last order by col2) col4,
max(col5) keep (dense_rank last order by col2) col5
from s
group by col1;
C COL2 C C C
- ---------- - - -
A 2 x x y
B 1 x y x
Elapsed: 00:00:00.01