Так же, как альтернатива ответу Тима, другой вариант - использовать агрегатную функцию с keep (dense_rank first ...)
или last
:
select account, max(date_col) as max_date,
max(value) keep (dense_rank last order by date_col) as value_from_max_date
from your_table
group by account;
который с вашими образцами данных, предоставленными в CTE (и изменяя имя столбца данных на что-то допустимое), дает тот же результат:
with your_table (account, date_col, value) as (
select 123456, date '2017-04-20', 5 from dual
union all select 123456, date '2017-01-20', 10 from dual
union all select 987654, date '2018-02-05', 15 from dual
union all select 987654, date '2017-12-31', 20 from dual
union all select 456789, date '2018-04-27', 50 from dual
union all select 456789, date '2018-01-24', 60 from dual
)
select account, max(date_col) as max_date,
max(value) keep (dense_rank last order by date_col) as value_from_max_date
from your_table
group by account;
ACCOUNT MAX_DATE VALUE_FROM_MAX_DATE
---------- ---------- -------------------
123456 2017-04-20 5
456789 2018-04-27 50
987654 2018-02-05 15
Если у вас есть много столбцов для включения из этой целевой строки, тогда это становится грязным, а другой подход проще; но в некоторых отношениях это яснее для этой ситуации (ИМО).