@TheGameiswar 给你很好的答案(使用 Row_number!),这里基于他的答案但没有WHERE,这里使用子查询:
with dep(id,name) as (select 1, 'sales' from dual union all
select 2, 'develop' from dual),
emp(id,dep_id, name, hire_date) as (select 1,1,'john',sysdate from dual union all
select 2,1,'kim', sysdate-100 from dual union all
select 3,1,'kim', sysdate-101 from dual union all
select 4,2,'kate', sysdate-1000 from dual union all
select 5,2,'richard', sysdate-300 from dual union all
select 6,2,'jack', sysdate-500 from dual)
select dep.*, emp.*
from dep inner join
(select emp.*, row_number() over (partition by emp.dep_id order by hire_date desc) rn from emp) emp
on dep.id = emp.dep_id
-- here no WHERE clause :)
and emp.rn = 1
order by dep.name,emp.name
输出:
ID NAME ID DEP_ID NAME HIRE_DATE RN
---------- ------- ---------- ---------- ------- --------- ----------
2 develop 5 2 richard 29.09.15 1
1 sales 1 1 john 25.07.16 1
或者你可以像这样使用双group by
with dep(id,name) as (select 1, 'sales' from dual union all
select 2, 'develop' from dual),
emp(id,dep_id, name, hire_date) as (select 1,1,'john',sysdate from dual union all
select 2,1,'kim', sysdate-100 from dual union all
select 3,1,'kim', sysdate-101 from dual union all
select 4,2,'kate', sysdate-1000 from dual union all
select 5,2,'richard', to_date('1.07.2016','dd.mm.yyyy') from dual union all
select 6,2,'richard2', to_date('1.07.2016','dd.mm.yyyy') from dual union all
select 7,2,'jack', sysdate-500 from dual)
select * from dep inner join emp on dep.id = emp.dep_id
inner join
(select max(emp.id) emp_id from emp
inner join (select max(hire_date) hdate from emp group by dep_id) emp_max
on emp.hire_date = emp_max.hdate
group by hdate) last_hire_emp
on emp.id = last_hire_emp.emp_id
order by dep.name,emp.name
输出:
ID NAME ID DEP_ID NAME HIRE_DATE EMP_ID
---------- ------- ---------- ---------- -------- --------- ----------
2 develop 6 2 richard2 01.07.16 6
1 sales 1 1 john 25.07.16 1
最后一个例子在hire_date有2个emp,在这个例子中我用max(id)获取