with t as (select 'Клиент1' client, 'Включен' status, to_date('01.01.1970', 'dd.mm.yyyy') hist_date from dual union all
select 'Клиент1', 'Отключен', to_date('01.01.1971', 'dd.mm.yyyy') hist_date from dual union all
select 'Клиент2', 'Включен', to_date('01.02.1971', 'dd.mm.yyyy') hist_date from dual union all
select 'Клиент2', 'Включен', to_date('01.01.1971', 'dd.mm.yyyy') hist_date from dual union all
select 'Клиент2', 'Отключен', to_date('03.01.1971', 'dd.mm.yyyy') hist_date from dual union all
select 'Клиент3', 'Отключен', to_date('01.04.1972', 'dd.mm.yyyy') hist_date from dual union all
select 'Клиент3', 'Включен', to_date('01.01.1973', 'dd.mm.yyyy') hist_date from dual)
select client, max(status) keep(dense_rank last order by hist_date) last_status
from t
group by client
-- ну и прочие вариации на тему )
-- если полей на выходе много, не пробовал, но можно попробовать сначала вместо статуса достать rowid, потом прицепиться по ним к исходной таблице
|