复杂SQL查询引用以前的记录

时间:2016-12-28 14:38:26

标签: sql oracle11g

我有以下要求,需要你的帮助。

我有一张桌子:

name desig
A   manager
B   employee
C   employee
D   employee
E   employee
F   manager
G   employee

我需要得到结果:

emp manager
A null
B A
C A
D A
E A
F null
G F

以下是为方便起见而开发的脚本:

create table int2 (name varchar(10), desig varchar(10));

insert into int2 values ('A','manager');
insert into int2 values ('B','employee');
insert into int2 values ('C','employee');
insert into int2 values ('D','employee');
insert into int2 values ('E','employee');
insert into int2 values ('F','manager');
insert into int2 values ('G','employee');

commit;

我尝试运行以下查询但没有帮助

with test as (
      select a.* , rownum rn from int2 a
     )
select a.name, a.desig
from test a, test b
where a.rn = b.rn+1
    and a.desig !=b.desig;

1 个答案:

答案 0 :(得分:3)

这里的关键是将员工分组。从第一次出现经理到下一次出现,所有员工都被分类到同一个组。一个小组的所有员工都将拥有相同的经理。

这可以使用sum窗口功能完成。单独运行内部查询以查看如何分配组。此后,获取每个小组经理的代码非常直观。

select name,case when desig='manager' then null 
            else max(case when desig='manager' then name end) over(partition by grp) end as mgr
from (select i.*
      ,sum(case when desig='manager' then 1 else 0 end) over(order by name) as grp
      from int2 i
     ) x

Sample Demo