我有以下要求,需要您的帮助。
我有一个表:
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;
这里的关键是将员工分为组。从第一次出现经理到下次发生,所有员工都分为同一组。小组的所有员工都将拥有相同的经理。
这可以使用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