Это своего рода сценарий, когда аналитические функции вступают в свои права ....
select type_cd
, id as max_id
, test_val
from (
select type_cd
, id
, test_val
, rank () over (partition by type_cd order by id desc) as rank_id
from your_table
)
where rank_id = 1
/
редактировать
Приведенный выше запрос не удовлетворяет вашу потребность в одной строке. Сортировка этого запроса в CTE, как это, должна сделать это ...
with subq as
( select type_cd
, id as max_id
, test_val
from (
select type_cd
, id
, test_val
, rank () over (partition by type_cd
order by id desc) as rank_id
from your_table
)
where rank_id = 1 )
select m.id as m_id
, m.test_val as m_test_val
, h.id as h_id
, h.test_val as h_test_val
from ( select * from subq where type_cd = 'M') m
join ( select * from subq where type_cd = 'H') h
/