with t as
(select 1 dep, sysdate-2 hire_date, 500 salary, 'Smith' name from dual
union all
select 1 dep, sysdate-1 hire_date, 999 salary, 'Smith1' name from dual
union all
select 1 dep, sysdate-1 hire_date, 1000 salary, 'Smith2' name from dual)
select name
from
(select name, salary,dep,
max(salary) over (partition by dep order by hire_date desc, salary asc rows between unbounded preceding and current row) best_salary
from t)
where salary<best_salary