Если все, что вам нужно, это выбрать максимальное количество кредитных часов для каждого идентификатора, но таким образом, чтобы при наличии кредитных часов для «MIC» или «Warrens» для данного идентификатора, все остальные кампусы для того же идентификатора должны бытьигнорируется, тогда наиболее эффективным способом является использование агрегатной функции FIRST, например, так:
with
sample_data(id, campus, credit_hr) as (
select 1, 'MIC' , 3 from dual union all
select 1, 'Warrens', 4 from dual union all
select 1, 'Online' , 3 from dual union all
select 1, 'Online' , 3 from dual union all
select 2, 'MIC' , 5 from dual union all
select 2, 'Warrens', 3 from dual union all
select 2, 'Online' , 6 from dual union all
select 3, 'Online' , 3 from dual union all
select 3, 'Online' , 3 from dual union all
select 3, 'West' , 2 from dual union all
select 4, 'Warrens', 3 from dual union all
select 4, 'MIC' , 3 from dual union all
select 4, 'West' , 7 from dual union all
select 5, 'Online' , 3 from dual union all
select 5, 'West' , 3 from dual union all
select 5, 'East' , 3 from dual
)
select id,
max(credit_hr) keep (dense_rank first
order by case when campus in ('MIC', 'Warrens') then 0 end)
as max_hr
from sample_data
group by id
order by id
;
ID MAX_HR
----- ------------------
1 4
2 5
3 3
4 3
5 3
Вы также можете изменить запрос (добавить больше столбцов), чтобы показать, был ли максимум из основного кампуса (чтоесли у этого удостоверения были ЛЮБЫЕ кредитные часы из одного из крупных кампусов), и / или чтобы показать, в каком кампусе было максимальное количество часов для этого идентификатора (или одного из кампусов, если в течение большинства часов была связь).