Вы также можете сделать это с аналитическими функциями , чтобы потребовать только один проход по данным:
with my_tab as (
select 1091 as id, 'info5' as info, to_date('10/10/2010',' DD/MM/YYYY') as date_dt from dual
union all select 1239, 'old.info', to_date('14/09/2010', 'DD/MM/YYYY') from dual
union all select 1340, 'old.info', to_date('07/10/2010', 'DD/MM/YYYY') from dual
union all select 3481, 'info', to_date('16/10/2010', 'DD/MM/YYYY') from dual
union all select 4134, 'info3', to_date('21/01/2011', 'DD/MM/YYYY') from dual
)
select id, info, to_char(date_dt, 'DD/MM/YYYY')
from (
select id, info, date_dt, rank() over (order by ord, date_dt desc) as rnk
from (
select id, info, date_dt,
case info
when 'info' then 1
when 'old.info' then 2
when 'info3' then 3
else null
end as ord
from my_tab
)
)
where rnk = 1;
ID INFO DATE_DT
---------- -------- ----------
3481 info 16/10/2010
Выбив строку 'info', вы получите:
ID INFO DATE_DT
---------- -------- ----------
1340 old.info 07/10/2010
Вероятно, не лучше, чем у @ Vincent для этого тривиального случая, но с большим количеством данных и большим количеством значений, которые можно выбрать, это может лучше масштабироваться - просто нужно больше ord
значений в этом случае, хотя с любыми реальными данными, которые у меня были быдумал, что ты найдешь приоритет из другой таблицы ...